基本概念
定义:只允许在表的一端进行插入,删除操作的线性表
允许操作的那一段叫做栈顶top。
表中没有元素就是空栈。
特点:后进先出,先进后出
栈的基本操作:
- 插入
- 删除
- 测试为空
- 检验已满
- 出栈
构造原理
1.顺序存储
数组:STACK[0…M-1]
同时定义整型变量top来给出栈顶元素的位置。
上溢:top=M-;
下溢:top=-1;
1)初始化
void initStack()
{
Top=-1;
}
2)测试是否为空
int isEmpty()
{
return Top==-1;
}
3)测试是否已满
int isFull()
{
return Top==MAXSIZE-1;
}
4)进栈
void push(ElemType s[],ElemType item)
{
if(isFull())
Error("Full Stack!");
else
s[++Top]=item;
}
5)出栈
Elemtype pop(Elemtype s[])
{
if(isEmpty())
Error("Empty Stack!");
else
return s[Top--];
}
多栈共享连续空间(省略)
2.链式存储
线性链表
指针表示栈顶 top
栈为空时 top=NULL
插入删除始终在链表的头;
实现:
定义一个链栈:
struct node{
ElemType data;
struct node *link;
};
typedef struct node *Nodeptr;
typedef struct node Node;
Nodeptr Top;//栈顶
初始化为全局变量;
操作:
1)初始化
void initStack()
Top=NULL;
2)测试为空
int isEmpty()
{
return Top==NULL;
}
3)链表不可能满
4)进栈
void push(ElemType item)
{
Nodeptr
p=(Nodeptr)malloc(sizeof(Node));
p->data=item;
p->link=Top;
Top=p;
}
5)出栈
Elemtype pop()
{
Nodeptr p;
ElemType item;
if(isEmpty)
Error("Empty Stack");
else{
p=Top;
item=Top->data;
Top=Top->link;
free(p);
return item;
}
}
}