一.栈的定义:
栈是只能在表的一端进行删除和插入操作的线性表,运行删除和插入操作的一端成为栈顶,另一端为栈底。满足后进先出的特性。
二.栈的顺序存储实现:
//定义顺序栈结构
#define StackSize 100
typedef int DataType;
typedef struct {
DataType data[StackSize];
int top;
}SeqStack;
//初始化
void initStack(SeqStack *s){
s->top=-1;
}
//入栈
void push(SeqStack *s,DataType x){
if(s->top==StackSize-1) {
throw "下溢异常";
}
s->top++;
s->data[s->top]=x;
}
//出栈
DataType pop(SeqStack *s){
if(s->top==-1){
throw "下溢异常";
}
return s->data[s->top--];
}
//取栈顶元素
DataType top(SeqStack *s){
if(s->top==-1){
throw "下溢异常";
}
return s->data[s->top];
}
//判空操作
int empty(SeqStack *s){
if(s->top==-1) return 1;
else return 0;
}
三.栈的链接存储结构定义:
//定义链栈结构
typedef int DataType;
typedef struct Node{
DataType data;
Node *next;
}Node;
//初始化
void initStack(Node *top){
top=NULL;
}
//入栈
void push(Node *top,DataType x){
Node* s=(Node*)malloc(sizeof(Node));
s->data=x;
s->next=top;
top=s;
}
//出栈
DataType pop(Node *top){
if(top==NULL){
throw "下溢异常";
}
DataType x=top->data;
top=top->next;
return x;
}
//取栈顶元素
DataType top(Node *top){
if(top==NULL){
throw "下溢异常";
}
return top->data;
}
//判空
int empty(Node *top){
if(top==NULL) return 1;
else return 0;
}
//销毁栈
void destroyStack(Node *top){
Node *p=top;
while(top!=NULL){
free(p);
top=top->next;
p=top;
}
}