栈
栈的定义
栈:是一种,只能在一端进行插入和删除操作的线性表。
栈的几个概念
1、栈顶:允许进行插入、删除操作的一端。
2、栈底:表对于可操作一端的另一端。
3、空栈:当栈中没有数据元素时,称为空栈。
4:入栈(进栈):栈的插入操作。
5、出栈(退栈):栈的删除操作。
栈的主要特点:元素后进先出。
栈的几种基本运算:
1、初始化栈,构造一个空栈。
2、销毁栈,释放其空间。
3、判断是否为空栈。
4、进栈。
5、出栈。
6、取栈顶元素。
顺序栈
定义一个顺序栈类型:
typedef struct {
int data[10];//一个任意数据类型的数组,这里我用的int
int top; //一个去记录数组下标的数,像一个指针
}SqStack;
我们一般的操作是,将空栈的top先设为-1,当栈内每进一个元素的时候,top++,保证top记录的是栈顶。
所有就有了下面两特点:
1、当空栈的时候top= -1;
2、当满栈的时候top=MaxSize-1 (假设数组长为MaxSize);
顺序栈四要素:
1、栈空条件:top = -1
2、栈满条件:top = MaxSize - 1
3、进栈操作:top++ ;将元素放在top处
4、退栈操作:从top处取出元素 ;top- -
1、初始化栈:
void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}//在刚才的基础上构建一个空栈
2、销毁栈:
void DestoryStack(SqStack *&s){
free(s);
} //顺序栈是可以直接free掉的
3、判断栈是否为空
bool StackEmpty(SqStack *s){
return (s->top==-1);
}//只要判断top是否为-1就行了
4、进栈
bool Push(SqStack*&s,int e){
if(s->top==MaxSize-1){
return false;
}
s->top++;
s->data[s->top]=e;
return true;
}
5、出栈
bool Pop(SqStack *&s,int &e){
if(s->top==-1){
return false;
}
e=s->data[s->top];
s->top--;
return true;
}
6、取栈顶元素
bool GetTop(SqStack *s,int &e){
if(s->top==-1){
return false;
}
e=s->data[s->top];
return true;
}
链栈
链栈的四要素:
1、栈空条件:s->next=NULL。
2、栈满条件:不考虑。
3、进栈操作:将新的节点插在头节点之后。
4、退栈操作:取出头节点之后节点的元素并删除。
定义链栈的类型LiStack:
typedef struct linknode{
int data; //数据域
struct linknode *next; //指针域
}LiStack;
1、初始化栈
void(LiStack *&s){
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}
2、销毁栈
void DestroyStack(LiStack *&s){
LiStack *p=s,*q=s->next;
while(q!=NULL){
free(p);
p=q;
q=p->next;
}
free(p); //此时只有最后一个尾节点没有释放
}
3、判断栈是否为空
bool StackEmpty(LiStack *s){
return (s->next==NULL);
}
4、进栈
void Push(LiStack *&s,int e){
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}
5、出栈
bool Pop(LiStack *&s,int &e){
LiStack *p;
if(s->next==NULL){
return false;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
6、取栈顶元素
bool GetTop(LiStack *s,int &e){
if(s->next==NULL){
return false;
}
e=s->next->data;
return true;
}