1、栈(Stack)
(stack:一堆)
定义
栈是只允许在一端进行插入或删除操作的线性表
重要术语:栈顶、栈底、空栈
基本操作
创、销:
- InitStack(&S):初始化栈
- DestroyStack(&S):销毁栈
增、删:
- Push(&S, x):进栈
- Pop(&S, &x):出栈
查:
- GetTop(S, &x):读栈顶元素
其他常用操作:
- StackEmpty(S):判断一个栈S是否为空
2、顺序栈
用顺序存储方式实现的栈
//顺序栈的定义
#define Maxsize 10
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack; //Sq:sequence顺序
基本操作
栈顶指针在初始化栈时有两种情况:top=-1、top=0。注意区分
进栈操作
bool Push(SqStack &S, ElemType x){
if(S.top==MaxSize-1)
return false;
//S.top = S.top + 1;
//S.data[S.top] = x;
S.data[++S.top] = x;
return true;
}
出栈操作
bool Pop(SqStack &S, ElemType &x){
if(S.top==-1)
return false;
//x = S.data[S.top];
//S.top = S.top - 1;
x = S.data[S.top--];
return true;
}
读栈顶元素
bool GetTop(SqStack S, ElemType &x){
if(S.top==-1)
return false;
x = S.data[S.top];
return true;
}
共享栈
#define Maxsize 10
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top0;
int top1;
}ShStack;
//初始化
void InitStack(ShStack &S){
S.top0=-1;
S.top1=MaxSize;
}
3、链栈
用链式存储方式实现的栈
//链栈的定义
#define Maxsize 10
typedef struct Linknode{
ElemType data; //数据域
struct Linknode *next; //指针域
}Linknode,*LiStack;
基本操作
注意:所有操作都是在单链表的表头进行的,栈顶指针指向表头结点。
初始化
LiStack Init_Linknode(){
LiStack top = (Linknode *)malloc(sizeof(Linknode)); //栈顶指针变量
if(top != NULL){
top->next = NULL;
}
return top;
}
进栈操作
int Push_LiStack(LiStack top,elemtype x){
Linknode *node = (Linknode *)malloc(sizeof(Linknode));
if(node == NULL){
return 0;
}
else{
node->data = x;
node->next = top->next;
top->next = node;
return 1;
}
}
出栈操作
int Pop_LiStack(LiStack top,elemtype *x){
Linknode *node;
if(top->next == NULL){
return 0;
}
else{
node = top->next;
*x = node->data;
top->next = node->next;
free(node);
return 1;
}
}
读栈顶元素
int Get_LiStack(LiStack top,elemtype *x){
if(top->next == NULL){
return 0;
}
else{
*x = top->next->data;
return 1;
}
}