数据结构与算法(4)— 线性栈
(mi6236)
1、顺序栈
1.1、栈的简述
栈(stack)又叫堆栈,它是一种预算受限的线性表,只能在表的一端进行插入和删除运算。栈中允许插入、删除的一端称为栈顶,另一端称为栈底。处于栈顶位置的数据元素称为栈顶元素,向一个栈插入新元素称为进栈、入栈、压栈,从一个栈删除元素又称作出栈或退栈,不含任何元素的栈称为空栈。栈的特点为后进先出(Last In First Out,LIFO)。
日常例子:刷洗盘子、自动步枪上枪膛中的子弹。
1.2、栈的顺序存储结构
栈的顺序存储用向量作为栈的存储结构,向量S表示栈,m表示栈的大小,用一栈指针top指向栈顶位置S[top]表示栈顶元素,当在栈中进行插入、删除操作时,都要移动栈指针;而当top=m-1,则栈满,当top=-1,表示栈空。
栈的顺序存储结构的C语言描述
#include <stdio.h>
#define StackSize 100/*栈的容量*/
typedef int ElemType;
typedef struct{
ElemType data[StackSize];
int top;
}SqStack;
1.3、顺序栈基本函数算法描述
注:一下程序在VC6.0+WIN2K下测试通过。
1.3.1、初始化
由于C语言的数组下标的范围从0到StackSize-1,初始设置sq.top=-1。
void InitStack(SqStack *s)
{
s->top=-1;
}
1.3.2、判断一个栈是否为空
栈空条件为-1==sq.top。
int StackEmpty(SqStack s)
{
if(-1==s.top)
return 1;
else
return 0;
}
1.3.3、压栈
栈满条件为StackSize-1=sq.top,栈顶元素为sq.data[sq.top]。元素压栈的规则为:在栈不满时,先改变栈顶指针(top=top+1)再压栈,栈中元素的个数为当前栈顶指针加1。
int push(SqStack *s,ElemType e)
{
if(s->top<StackSize-1)
{
s->top=s->top+1;
s->data[s->top]=e;
return 1;
}
else
{
printf("overflow!/n");
return 0;
}
}
1.3.4、出栈
在栈非空时,先取栈顶元素的值,再修改栈顶指针(top=top-1)。
int pop(SqStack *s,ElemType *e)
{
if(-1==s->top)
{
printf("underflow/n");
return 0;
}
else
{
*e=s->data[s->top];
(s->top)--;
return 1;
}
}
1.3.5、取栈顶
int GetTop(SqStack s,ElemType *e)
{
if (-1==s.top)
{
printf("underflow/n");
return 0;
}
else
{
*e=s.data[s.top];
return 1;
}
}
1.3.6、清栈
void ClearStack(SqStack *s)
{
s->top=-1;
}
1.3.7、显示栈中的所有元素
void ShowStack(SqStack s)
{
while(!StackEmpty(s))
{
printf("栈中元素依次为:%d/n",s.data[s.top]);
(s.top)--;
}
}
1.3.8、测试程序
int main()
{
SqStack sq;
ElemType e;
InitStack(&sq);
if(StackEmpty(sq))
printf("栈空/n");
ShowStack(sq);
push(&sq,3);
push(&sq,2);
push(&sq,1);
if(StackEmpty(sq))
printf("栈空/n");
ShowStack(sq);
pop(&sq,&e);
printf("出栈元素为%d/n",e);
ShowStack(sq);
GetTop(sq,&e);
printf("栈顶元素为%d/n",e);
ClearStack(&sq);
pop(&sq,&e);
if(StackEmpty(sq))
printf("栈空/n");
return 1;
}