栈和队列实质上是俩种受限制的线性表
一 栈的定义:
栈(stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(top),另一端称为栈底(bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(last in first out)的线性表,简称为lifo表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
二 栈的顺序存储结构
实质上是运算受限的线性表
(1)顺序栈的类型定义
#define stacksize 100//假定预先分配100元素
typedef char datatype;//假定栈元素的数据类型为字符
typedef struct
{
datatype data[stacksize];
int top;
}seqstack;
注:top用来指示当前栈顶的位置,因为在栈低是不变的
三 顺序栈的基本操作
规定: s是seqstack类型指针,s->data[0]为栈底元素
(1)进栈操作
进栈时,需要将s->top加1
①s->top==stacksize-1表示栈满
②"上溢"现象--当栈满时,再做进栈运算产生空间溢出的现象。
(2)出栈操作
退栈时,需将s->top减1
①s->top<0表示空栈
②"下溢"现象——当栈空时,做退栈运算产生的溢出现象。
置栈空
void initstack(seqstack *s)
{//将顺序栈置空
s->top=-1;
}
判栈空
int stackempty(seqstack *s)
{
return s->top==-1;
}
判栈满
int stackfull(seqstack *s)
{
return s->top==stacksize-1;
}
进栈
void push(seqstack *s,int x)
if (stackfull(s))
printf("stack overflow"); //上溢,退出运行
s->data[++s->top]=x;//栈顶指针加1后将x入栈
退栈
datatype pop(seqstack *s)
if(stackempty(s))
{
printf("stack underflow"); //下溢,退出运行
exit(0);
}
return s->data[s->top--];//栈顶元素返回后将栈顶指针减1
取栈顶元素
datatype stacktop(seqstack *s)
if(stackempty(s))
{
printf("stack is empty");
}
return s->data[s->top];
转载:http://blog.csdn.net/xsf50717/article/details/39934051