栈作为一种限定性线性表,是将表的插入删除限制为仅在表的一端进行,通常将表中允许插入删除的一端叫做栈顶(top),因此栈顶的当前位置是动态变化的。栈的另一端叫做栈底(bottom)。当栈中没有元素时称为空栈。插入操作称为进栈或入栈,删除操作称为出栈或退栈。栈是先进后出的线性表,简称为LIFO表。
栈主要有两种基本的存储结构:顺序存储结构和链式存储结构。简称顺序存储的栈为顺序栈,链式存储的栈为链栈。
顺序栈
存储结构
#define Stack_Size 50
typedef struct{
StackElementType elem[Stack_Size];
int top;
}SeqStack;
1.初始化
void InitStack(SeqStack *S) {
S->top = -1;
}
2.进栈
int Push(SeqStack *S, StackElementType x) {
if(S->top == Stack_Size-1)
return FALSE;
S->top++;
S->elem[S->top] = x;
return TRUE;
}
3.出栈
int Pop(SeqStack *S, StackElementType *x){
if(S->top == -1)
return FALSE;
else {
*x = S->elem[S->top];
S->top--;
return TRUE;
}
}
3.读栈顶元素
int GetTop(SeqStack *S, StackElementType *x){
if(S->top == -1)
return FALSE;
else {
*x = S->elem[S->top];
return TRUE;
}
}
链栈
存储结构
typedef struct node{
StackElementType data;
struct node *next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;
1.初始化
void InitStack(LinkStack *S) {
S->next = NULL;
}
2.进栈
int Push(LinkStack top, StackElementType x) {
LinkStackNode *temp;
temp = (LinkSatckNode*)malloc(sizeof(LinkStackNode));
if(temp == NULL)
return FALSE;
temp->data = x;
temp->next = top->next;
top->next = temp;
return TRUE;
}
3.出栈
int Pop(LinkStack top, StackElementType *x){
LinkStackNode *temp;
temp = top->next;
if(temp == NULL)
return FALSE;
top->next = temp->next;
*x = temp->data;
free(temp);
return TRUE;
}