1、栈(Stack)
栈是限定在表尾进行插入删除的线性表(尾插尾删)。表尾端为栈顶(An),表头为栈底(A1)。栈是后进先出(LIFO)的线性表。
出栈:从栈顶(表尾)删除最后一个元素
入栈:插入到栈顶
*只能在栈顶运算,且访问结点时依照LIFO(后进先出)原则。
2、顺序栈
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端。
存储方式:同一般线性表的顺序存储结构完全相同。
简单、方便,但容易溢出。
·附设top指针,指示栈顶元素在顺序栈中的位置。但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址
·另设base指针,指示栈底元素在顺序栈中的位置。
·另外,用stacksize表示栈可使用的最大容量
3、顺序栈存储结构
#define MAXSIZE 5 //顺序栈存储空间的初始分配量
typedef int Status;
typedef int SElemType;
typedef struct {
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
} SqStack;
base为栈底指针,初始化完成后,栈底指针base始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。
top 为栈顶指针,其初值指向栈底。每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1。
因此,栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。
4、顺序栈表示
空栈:base == top
栈满:top-base==stacksize元素个数:top-base
上溢:栈满又压入元素
下溢:栈空又弹出元素(通常为结束条件:base == top)
栈满时的处理方法:
1、报错,返回操作系统。
2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。(耗费大量时间)
5、顺序栈初始化
为顺序栈动态分配一个预定义大小数组空间。
1、为顺序栈动态分配一个最大容量是MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底。
2、栈顶指针top初始为base,表示栈为空。
3、 stacksize置为栈的最大容量MAXSIZE。
//算法3.1 顺序栈的初始化
Status InitStack(SqStack &s)
{
//构造一个空栈S
s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!s.base)
exit(OVERFLOW); //存储分配失败
s.top = s.base; //top初始为base,空栈
s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
6、判断空栈
base == top
bool StackEmpty(SqStack s)
{
if (s.top==s.base)return 1;
return 0;
}
7、清空栈
使栈为空
Status ClearStack(SqStack s)
{
if (s.base) s.top = s.base;
return OK;
}
销毁栈
使栈不存在
void DestroyStack(SqStack &s)
{
/* 销毁栈S,S不再存在 */
delete []s.base;
s.base = s.top = NULL;
s.stacksize = 0;
}
8、入栈
①判断是否栈满
②压入新元素,栈顶指针+1
Status Push(SqStack &s, SElemType e)
{
if (s.top-s.base==s.stacksize) return ERROR;
*s.top++=e;//*s.top=e;s.top++;将元素e压入栈顶,栈顶指针++
return OK;
}
9、出栈
①判断是否栈空
②栈顶指针-1,弹出栈顶元素
Status Pop(SqStack &s, SElemType &e)
{
if (s.base==s.top) return ERROR;
e=*--s.top;//--s.top;e=*s.top 栈顶指针--,将栈顶元素赋给e
return OK;
}
10、取栈顶元素
栈非空时,返回栈顶元素,栈顶指针不变
SElemType GetTop(SqStack s)
{
if (s.top!=s.base) //栈非空
return *(s.top-1);//返回S的栈顶元素,不修改栈顶指针
}
11、输出栈
void PrintStack(SqStack s)
{
for(SElemType *top = s.top - 1; top >= s.base; top--) {
cout << (*top);
if(top != s.base)
cout << ' ';
}
cout << endl;
}
12、栈长
元素个数:top-base
int StackLength( SqStack s)
{
return s.top - s.base;
}