栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入。删除的一端为栈顶(Top),对应在的。则称还有一端为栈底(Bottom)。
不含元素的栈则称为空栈。
所设栈S={a1,a2,a3,...,an},则称a1为栈底元素,an为栈顶元素。
依据栈的定义可知,栈顶元素总是最后入栈而且最先出栈的。栈底元素总是最先入栈而且最后出栈的。
即栈是按后进先出的原则进行的。
因此,栈又称为后进先出(LIFO)的线性表。
而顺序栈。即栈的顺序存储结构。它是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同一时候附设指针top指示栈顶元素在顺序表中的位置。类似于顺序表,用一维数据描写叙述顺序中的数据元素的存储区域,而栈顶的位置则是随着插入和删除而变化的,通常将用一个整数表示,将数组下标为0的一端设置为栈底。
顺序栈的类型描写叙述:
#define MAXSIZE 100 //栈的最大空间 //顺序栈类型描写叙述 typedef int ElemType; typedef struct{ ElemType data[MAXSIZE]; int top; }SqStack;
在顺序栈中。若将数组下标为0的一端设为栈底,则当top的值为-1时,则表示栈空,每次向栈中压入一个元素时,首先便top的值加1,然后再把数据元素在于该位置。
每次从栈中弹出一个元素时,首先取出栈顶元素,然后使top的值减1。指示新的栈顶元素。
顺序栈的基本操作:
1. 初始化栈Init_SqStack(SqStack* S)
顺序栈的初始化是要构造一个空的顺序栈。仅仅须要将空顺序栈S中的top置为-1,表示栈中眼下并没有数据元素,算法的复杂度为O(1)。
//初始化栈 void Init_SqStack(SqStack* S){ S->top = -1; }
2. 推断栈空isEmpty_SqStack(SqStack* S)
由于栈底设置在数组的0下标处,即S->data[0]表示栈底元素。所以空栈时栈顶指针top=-1。若top=-1,则表示栈空。返回1,否则。则表示栈非空。返回0,算法的复杂度为O(1)。
//推断栈空 int isEmpty_SqStack(SqStack* S){ if(S->top == -1) return 1; else return 0; }
3. 推断栈满isFull_SqStack(SqStack* S)
由于设置了栈的最大空间。所以在入栈时必须先推断栈是否已满,即当top= MAXSIZE时。则表示栈满,返回1,否则,则表示栈非空,返回0。算法的复杂度为O(1)。
//推断栈满 int isFull_SqStack(SqStack* S){ if(S->top == MAXSIZE) return 1; else return 0; }
4. 入栈 Push_SqStack(SqStack* S,ElemType x)
首先。检測栈是否已满。若是。则输出提示信息。结束,否则。指针top值加1,将元素x存于栈顶位置就可以,算法的复杂度为O(1)。
//入栈操作 void Push_SqStack(SqStack* S,ElemType x){ //栈满,则退出 if(isFull_SqStack(S)){ printf("栈满! "); exit(0); } else{ S->data[++(S->top)] = x; } }
5. 出栈Pop_SqStack(SqStack* S,ElemType* x)
首先,检測栈是否为空。若是。则输出提示信息,结束,否则,将栈顶元素赋值给x,并将指针top减1,。算法的复杂度为O(1)。
//出栈 void Pop_SqStack(SqStack* S,ElemType* x){ //假设栈空,则输出提示信息,并退出 if(isEmpty_SqStack(S)){ printf("栈空! "); exit(0); } else *x = S->data[S->top--]; }
6. 读取栈顶元素Top_SqStack(SqStack* S,ElemType* x)
读顶元素与出栈运算都是取得栈顶元素的值,二者的差别在于:读栈顶元素时,栈顶指针不发生变化,仅读取栈顶元素,而出栈还要将栈顶元素删除,此时,栈顶指针也要发生变化,时间复杂度为O(1)
//读取栈顶元素 void Top_SqStack(SqStack* S,ElemType* x){ if(isEmpty_SqStack(S)){ printf("栈空! "); exit(0); } else *x = S->data[S->top]; }
7. 输出整个栈Print_SqStack(SqStack* S)
输出栈。仅仅须要从栈顶開始读取到栈底。将栈中全部的数据元素输出就可以。
//输出整个栈 void Print_SqStack(SqStack* S){ if(isEmpty_SqStack(S)){ printf("栈空! "); exit(0); } int length = S->top; while(length > -1) printf("%d ",S->data[length--]); printf(" "); }