栈是一种特殊的线性表,插入和删除操作均在栈顶进行,插入操作称为入栈,删除操作称为出栈。
一、顺序栈
利用顺序存储方式实现的栈称为顺序栈,下面是它的一些基本操作实现算法,需要理解和记忆。
1.顺序栈的类型定义
#define StackSpaceIncr 20 typedef struct{ SElemType *base; int top; int stackSize; }SqStack;//顺序栈类型
2.初始化操作InitSqStack(&S,InitSize)
Status InitSqStack( SqStack &S,int InitSize) { S.base=(SElemType *)malloc(InitSize * sizeof(SElemType)); if(!S.base) return OVERFLOW;//若失败 S.stackSize=InitSize; S.top=0;//置为空栈 return OK; }
3.判空操作stackIsEmpty(S)
Status stackIsEmpty(SqStack S) { if(!S.top) return TRUE; else return FALSE; }
4.清空操作clearStack(&S)
void clearStack(SqStack &S) { S.top=0; }
5.求栈长操作stackLength(S)
int stackLength(SqStack S) { return S.top; }
6.入栈操作Push(&S,e)
Status Push(SqStack &S,SElemType e) { SElemType * newBase; if(S.top==S.stackSize) { newBase=(SElemType *)realloc(S.base,(S.stackSize+StackSpaceIncr)*sizeof(SElemType)); if(! newBase) return OVERFLOW;//失败 S.base=newBase; S.stackSize+=StackSpaceIncr;//成功 } S.base[S.top]=e;//插入元素e S.top++;//栈顶指针top上移 return OK; }
7.出栈操作Pop(&S,&e)
Status Pop(SqStack &S,SElemType &e) { if(!S.top) return ERROR;//若失败 S.top--;//栈顶指针top下移 e=S.base[S.top]; return OK; }
8.取栈顶操作getTop(S,&e)
Status getTop(SqStack S,SElemType &e) { if(! S.top) return ERROR; e=S.base[S.top-1]; return OK; }
二、链式栈
利用链式存储结构实现的栈称为链式栈,利用单链表实现链式栈时,其初始化、判空、清空、求长度操作都与单链表相同。
1.链式栈类型定义
#define StackSpaceIncr 20 typedef struct stackNode { SElemType data; struct stackNode *next; }*LinkStack;//链式栈类型
2.初始化操作InitLinkStack(&S)
void InitLinkStack(LinkStack &S) { //初始化为空 S=NULL; }
3.入栈操作Push(&S,e)
Status Push(LinkStack &S,SElemType e) { LinkStack p; p=(LinkStack)malloc(sizeof(struct stackNode)); if(!p) return OVERFLOW; p->data=e; p->next=S; S=p;//在单链表的首端插入p结点 return OK; }
4.出栈操作Pop(&S,&e)
Status Pop(LinkStack &S,SElemType &e) { LinkStack p; if(!S) return ERROR; p=S; S=S->next; e=p->data; free(p); return OK; }
5.取栈顶操作getTop(S,&e)
Status getTop(LinkStack S,SElemType &e) { if(! S) return ERROR; e=S->data; return OK; }
三、栈的实例——简单的括号匹配检验
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "Status.h" 4 typedef char SElemType; 5 #include "SqStack.h" 6 int bracketsCheck() 7 { 8 char ch; 9 SqStack S; 10 InitSqStack(S,30); 11 ch=getchar(); 12 while(ch!='\n') 13 { 14 if(ch=='(') Push(S,ch); 15 else if(ch==')') 16 { 17 if(!stackIsEmpty(S)) Pop(S,ch); 18 else return -1; 19 } 20 ch=getchar(); 21 } 22 return stackLength(S); 23 } 24 int main() 25 { 26 int result; 27 printf("输入表达式串:\n"); 28 result=bracketsCheck(); 29 if(result==0) printf("括号匹配不正确!\n"); 30 else if(result>0) printf("错误,缺%d个\')\'! \n",result); 31 else printf("错误,缺少1个或多个\'(\'!\n"); 32 system("pause"); 33 return 0; 34 }