棧(stack)又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。 1.順序棧
#include<stdio.h>#include<stdlib.h> #define initSize 30typedef int DataType;typedef int SElemType; typedef struct {//順序棧的動態儲存裝置結構 SElemType *elem; int maxsize, top;}SeqStack; void InitStack(SeqStack &S) {//建立一個最大尺寸為initsize的空棧,若分配不成功則進行錯誤處理 S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//建立棧空間 if(S.elem==NULL) { printf("儲存空間分配失敗。\n"); exit(1); } S.maxsize=initSize; S.top=-1; } int Push(SeqStack &S, DataType x) {//進棧操作, 若棧不滿,則將元素 x 插入棧頂, 函數返回 1 ,否則棧溢出,函數返回 0; if(S.top==S.maxsize-1) return 0;//棧滿則溢出處理 S.elem[++S.top]=x;//棧頂指標先加 1 ,再進棧 return 1;} int Pop(SeqStack &S, SElemType &x) { //退棧; 若棧不空,則函數通過引用參數x 返回棧頂元素值,棧頂指標退 1, 函數指標返回 1; if(S.top==-1) return 0; x=S.elem[S.top--]; return 1; } int GetTop(SeqStack &S, SElemType &x) { //讀取棧頂元素的值:若棧不空則函數返回棧頂的值且函數返回 1, 否則函數返回 0 if(S.top==-1) return 0; x=S.elem[S.top]; return 1; } int StackEmpty (SeqStack &S) {//函數測試棧S是否空,若棧空,函數返回 1, 否則返回 0 return S.top==-1;//函數返回S.top==-1 的結果 } int StackFull(SeqStack &S) {//測試棧S 是否滿 ,若棧滿,函數返回 1, 否則返回 0 return S.top==S.maxsize;//此處為一邏輯運算式, 返回邏輯值的結果 } int StackSize(SeqStack &S) {//函數返回棧 S 的長度,即,棧中元素的個數 return S.top+1;} void Reverse(SElemType A[], int n) {//請空棧 SeqStack S; InitStack(S); int i; for(i=1; i<=n; i++) Push(S, A[i-1]); i=0; while(!StackEmpty(S)) Pop(S, A[i++]); }
2.鏈式棧
<stdio.h>#include<stdlib.h> typedef int DataType;typedef int SElemType;typedef struct node {SElemType data;struct ndoe *link; }LinkNode, *LinkStack; void InitStack(LinkStack &S) {S=NULL;} int Push(LinkStack &S, SElemType x) {//鏈式棧初始化;置頂棧指標,即鏈表頭指標為空白 LinkNode *p=(*LinkNode) malloc (sizeof(LinkNode));//建立新節點 p->data=x;p->link=S;S=p;//新節點插在鏈頭 return 1;} int Pop(LinkStack &S, SElemType &x) {//退棧,若棧空,函數返回 0 ,參數值 X不可用 if(S==NULL) return 0;LinkNode *p=S;x=p->data;//存棧頂元素 S=p->link;free(p);//棧頂指標退到新棧頂位置 return 1;} int GetTop(LinkStack &S, SElemTye &x) {//讀取棧頂,若棧不空,函數通過引用參數X 返回棧頂元素的值 if(S==NULL) return 0;//棧空,函數返回 0 x=S->data;return 1;} int StackEmpty (LinkkStack &S) {//判斷棧是否為空白 return s==NULL;} int StackSize(LinkStack &S) {//求棧的長度,計算棧元素的個數 LinkNode *p=S;int k=0;while(p!=NULL) {//逐個節點計算 p=p->link;k++;}return k;}
應用:
用順序棧寫標頭檔(軟體:DEVc++)
#ifndef __STACK_H__#define __STACK_H__#include<stdio.h>#include<stdlib.h> #define initSize 30typedef int DataType;typedef int SElemType; typedef struct {//順序棧的動態儲存裝置結構 SElemType *elem; int maxsize, top;}SeqStack; void InitStack(SeqStack &S) {//建立一個最大尺寸為initsize的空棧,若分配不成功則進行錯誤處理 S.elem=(SElemType*) malloc (initSize*sizeof(SElemType));//建立棧空間 if(S.elem==NULL) { printf("儲存空間分配失敗。\n"); exit(1); } S.maxsize=initSize; S.top=-1; } int Push (SeqStack &S, DataType x) {//進棧操作, 若棧不滿,則將元素 x 插入棧頂, 函數返回 1 ,否則棧溢出,函數返回 0; if(S.top==S.maxsize-1) return 0;//棧滿則溢出處理 S.elem[++S.top]=x;//棧頂指標先加 1 ,再進棧 return 1; } int Pop(SeqStack &S, SElemType &x) { //退棧; 若棧不空,則函數通過引用參數x 返回棧頂元素值,棧頂指標退 1, 函數指標返回 1; if(S.top==-1) return 0; x=S.elem[S.top--]; return 1; } int GetTop(SeqStack &S, SElemType &x) { //讀取棧頂元素的值:若棧不空則函數返回棧頂的值且函數返回 1, 否則函數返回 0 if(S.top==-1) return 0; x=S.elem[S.top]; return 1; } int StackEmpty (SeqStack &S) {//函數測試棧S是否空,若棧空,函數返回 1, 否則返回 0 return S.top==-1;//函數返回S.top==-1 的結果 } int StackFull(SeqStack &S) {//測試棧S 是否滿 ,若棧滿,函數返回 1, 否則返回 0 return S.top==S.maxsize;//此處為一邏輯運算式, 返回邏輯值的結果 } int StackSize(SeqStack &S) {//函數返回棧 S 的長度,即,棧中元素的個數 return S.top+1;} void Reverse(SElemType A[], int n) {//請空棧 SeqStack S; InitStack(S); int i; for(i=1; i<=n; i++) Push(S, A[i-1]); i=0; while(!StackEmpty(S)) Pop(S, A[i++]); }#endif 注意儲存的時候,儲存的格式為stack.h, 而不是stack.cpp;