1 栈的概念
- 栈:限定仅在表尾进行插入和删除操作的线性表,后进先出的线性表,简称LIFO结构
- 栈顶:表尾,允许插入和删除的一端
- 栈底:表头,不允许插入和删除的一端
- 空栈:不含任何数据元素的栈
2 栈的顺序存储结构
(1) 结构代码
typedef int SElemType
typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStack;
(2) 属性
(3) 操作
A 插入push:进栈
Status Push(SqStack *S,SElemType e)
{
if(S->top==MAXSIZE-1){ //栈满
return ERROR;
}
S->top++; //栈顶指针增加
S->data[S->top]=e; //将新插入元素赋值给栈顶空间
return OK;
}
B 删除pop:出栈
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==-1){
return ERROR;
}
*e=S->data[S->top]; //将要删除的栈顶元素赋值给e
S->top--; //栈顶指针减一
return OK;
}
C 进栈出栈有多种情况,只要保证是栈顶元素出栈就可以。
3 两栈共享空间
(1) 定义
一个栈增加,一个栈缩短,当top1+top2==top2时栈满。
(2) 结构代码
typedef struck
{
SElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
(3) 操作
A 插入push:进栈
Status Push(SqDoubleStack *S,SElemType e,int stackNumber)
{
if(S->top1+1==S->top2){ //栈已满,不能再push新元素了
return ERROR;
}
if(stackNumber==1){ //栈 1 有元素进栈
S->data[++S->top1]=e; //若是栈1则先top1+1后给数组元素赋值
}
else if(stackNumber==2){ //栈2有元素进栈
S->data[--S->top2]=e; //若是栈2则先top2-1后给数组元素赋值
}
return OK;
}
B 删除pop:出栈
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber)
{
if(stackNumber==1){
if(S->top1==-1){
return ERROR; //说明栈1已经是空栈,溢出
}
*e=S->data[S->top1--]; //将栈1的栈顶元素出栈
}
else if(stackNumber==2){
if(S->top2==MAXSIZE){
return ERROR; //说明栈2已经是空栈,溢出
}
*e=S->data[S->top2++]; //将栈 2 的栈顶元素出栈
}
return OK;
}
4 栈的链式存储结构
(1) 结构代码
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
(2) 操作
A 插入push:进栈
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode));
p->data=e;
p->next=S->top; //把当前的栈顶元素赋值给新结点的直接后继
S->top=p; //将新的结点s赋值给栈顶指针
S->count++;
return OK;
}
B 删除pop:出栈
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S)){
return ERROR;
}
*e=S->top->data;
p=S->top; //将栈顶结点赋值给p
S->top=S->top->next; //使得栈顶指针下移一位,指向后一结点
free(p); //释放结点p
S->count--;
return OK;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。