1.栈:栈和队列是两种特殊的线性表,他们的逻辑结构和线性表相同,但是运算规则有限制;
1.1.栈的定义及运算:
1.定义:栈是仅限在一端进行操作的线性表。对栈而言,允许进行插入和删除的一端称为栈顶,固定不变的一端称为栈底;
2.栈中的元素按照“后进先出”的规则进行。当栈中没有任何元素时称为栈空,当栈的存储空间被用完时,称为栈满;
3.对栈的基本操作:
栈初始化:init_Stack(s);生成一个空栈;
判断栈空:empty_Stack(s);判断栈是否为空栈,若是返回1,不是返回0;
入栈:push_Stack(s,x);在栈的顶部插入一个元素x,使x成为新的栈顶元素;
出栈:pop_Stack(s,x);在栈非空的情况下,将栈顶元素从栈中移除,并由x返回栈顶元素的值;
读栈顶元素:top_Stack(s,x);在栈非空的情况下,将栈顶元素读入x中。
1.2.顺序栈的运算和实现:
1.顺序栈是栈的顺序存储结构,利用一组连续的内存地址存放栈底到栈顶的元素;
2.定义格式:
typedef struct
{
datatype data[MAXSIZE];//栈中元素的存储空间
int top;//栈顶
}SeqStack;
top指针表示栈顶元素在栈中的位置,栈底的下标为0,故栈空时top=-1;
3.创建栈:
void init_SeqStack(SeqStack **s){
*s=(SeqStack *)malloc(sizeof(SeqStack));
(*s)->top=-1;
}
4.判断是否栈空
int empty_SeqStack(SeqStack *s){
if(s->top==-1){
return 1;
}else{
return 0;
}
}
5.入栈:
void push_SeqStack(SeqStack *s,char c){
if(s->top==MAXSIZE-1){
printf("Stack is full!!");
}else{
s->top++;
s->data[s->top]=c;
}
}
6.出栈:
void Pop_SeqStack(SeqStack *s,char *c){
if(s->top==-1){
printf("Stack is empty!!!");
}else{
*c=s->data[s->top];
s->top--;
}
}
7.取栈