栈是一种只允许在一端进行插入和删除操作的线性表,在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底。
栈具有“先进后出”的特性,即,先入栈的被压入栈底,后入栈的在栈顶。
栈的存储结构有两个,顺序存储和链式存储。
(1)栈的顺序存储结构
利用顺序存储方式实现的栈称为顺序栈。栈中数据元素用一个预设的足够长度的一维数组来实现。栈顶随着插入和删除而变化。
顺序栈的类型描述如下:
typedef struct {
datatype data[MAXSIZE];
int top; //栈顶
}SeqStack;
定义一个指向顺序栈的指针: SeqStack *s;
示意图:
顺序栈基本操作
1.初始化
置空栈:初始化栈顶指针。
/*初始化*/
SeqStack *initStack(){
SeqStack *s;
s = (SeqStack *)malloc(sizeof(SeqStack)); //动态申请内存
s->top = -1; //空栈时,栈顶指针top=-1
return s;
}
2.进栈:首先判断栈是否满了,如果栈满,返回false。否则进栈。
/*进栈*/
void push( SeqStack *s, datatype x ){
if( s->top >= MAXSIZE-1 ){ //判断栈满
printf("栈满!");
}else{
s->top++;
s->data[s->top] = x;
}
}
3.取栈顶元素
/*取栈顶元素*/
int topStack( SeqStack *s ){
datatype x;
if( isEmpty(s) ){ //判断栈是否为空
printf("栈空");
}else{
return x = s->data[s->top];
}
}
4.判断栈是否为空
/*判断栈是否为空*/
int isEmpty( SeqStack *s ){
if( s->top == -1 ){
return true; //栈空
}else{
return false;
}
}
5.出栈
/*出栈*/
void pop( SeqStack *s, datatype *x ){
if( isEmpty(s) ){ //判断栈空
printf("栈空");
}else{
*x = s->data[s->top]; //将栈顶元素存入*x中
s->top--;
}
}
(2)栈的链式存储方式
链式栈的类型描述如下:
typedef struct StackNode{
Elemtype data;
struct StackNode *next;
}StackType;
示意图:
链式栈的基本操作
入栈
//入栈
int push(StackType *top, ElemType x){
//将元素x压入链栈top中
StackType *p;
if( p = (StackTpe *)malloc(sizeof(StackType)) == NULL ){
return false;
}
//申请一个结点
p->data = x;
p->next = top->next;
top->next = p;
return true;
}
出栈
//出栈
ElemType pop(StackType *top){
StackType *p;
ElemType x;
//从top中删除栈顶元素
if( top->next == NULL ){
return NULL;
}
p = top->next;
top->next = p->next;
x = p->data;
free(p);
return x;
}
(完)