1.栈的概念
栈是一种限定操作进行方式的线性表,即只能在线性表的一端进行插入和删除操作。
如图1.1a的一端称作栈顶,b的一端称作栈底,栈的特点为先进后出。
添加元素:从栈顶a进入。当有新元素进入栈时,新元素就会在a的上面,如图1.2.
a |
b |
图1.1
新元素 |
a |
b |
图1.2
删除元素:假设栈为如图1.3,当我删除元素时,只能先删除a,从栈顶出,故删除了一个元素后的栈变成了图1.4
a |
b |
c |
如图1.3
b |
c |
图1.4
2.栈的顺序存储结构
C语言的存储结构描述
#define MAXSIZE 100
typedef struct{
DataType elem[MAXSIZE];
int top;
}Stack;
1.初始化顺序栈
Stack InitStack{
Stack S; //定义一个栈变量
S.top=-1; //空栈的top值为-1,表示此时为一个空栈
return(S);
}
分析:返回一个空的栈,空栈中元素个数为0,top值为-1。
2.进栈
Stack Push(Stack S,DataType x){
if(S.top==MAXSIZE-1){ //判断栈是否满
printf("栈已经满了,无法入栈");}
else
{
S.top=S.top+1; //栈顶先上移一位,指向新的栈顶位置
S.elem[S.top]=x; //把新元素x放到栈顶
}
return(S);
}
分析:顺序栈需要考虑容量问题。x进栈前要考虑栈是否满,栈没满时才可进栈。由于top指向栈顶元素位置,元素进栈前top应上移一位,指向新的栈顶位置,元素再放进top指向的位置,这样保证了操作结束后top含义不变
3.出栈
Stack top(Stack S){
if(S.top=-1){ //判断栈是否为空
printf("栈为空,无法出栈");
}
else{
S.top=S.top-1; //栈顶下移一位即可表示删除元素
}
return(S)
}
分析 :上述算法中只是将top的指示位置下移了一位,实际上,在存储单元中,原来的栈顶还在,但TOP不指向它,它的存在并不重要,当有新的元素进入栈顶时,会把它覆盖掉。
4取栈顶元素
DataType GetTop(Stack S)
{
if(S.top==-1){ //判断栈是否为空
printf("栈为空,无法取出栈顶")
}
else{
x=S.elem[S.top]; //把栈顶的元素的值给了x
return(x);
}
分析:取栈顶有别于出栈,取栈顶只是把栈顶元素的值读出来,并不修改栈的内容,当栈不为空时,可以取栈顶,栈顶及top所指向的元素
上述算法时间复杂度都为O(1),进栈和出栈相当于在顺序表中进行插入和删除操作,只是此时操作对象是线性表的最后一个元素,无需移动大量元素,从本质上讲,栈的操作是对线性表操作的“简化”,顺序表允许的操作在栈里可能会不允许进行。