栈的定义
栈是一种只允许在一端进行插入或删除操作的线性表。
首先,栈是一个线性表,但限定这种线性表只能在某一端进行插入和删除操作:
栈顶(Top) 线性表允许插入的那一端。
栈底(Bottom) 固定的,不允许进行插入和删除的另一端。
空栈 不含任何元素的空表。
栈的基本操作
// 栈的一些基本操作
InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。
Push(&S,e):进栈,若栈S未满,则将e加入使之成为新的栈顶。
Pop(&S,&e):出栈,若栈S非空,则弹出栈顶元素,并用e返回。
GetTop(S,&e):取栈顶元素,若栈S非空,则用e返回栈顶元素。
DestroyStack(&S):销毁栈,并释放S占用的存储空间。
静态分配
存储类型
#define MaxSize 50 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //存放栈中元素
int top; //栈顶指针
}SqStack;
栈顶指针:S.top,初始时设置S.top=-1;
栈顶元素:S.data[S.top]。
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。
出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减1。
栈空条件:S.top==-1;
栈满条件:S.top==MaxSize-1;
栈长:S.top+1。
由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能发生上溢,此时应及时向用户报告消息,以便及时处理,避免出错。
栈的基本运算
初始化
void InitStack(SqStack &S){
S.top=-1;
}
判栈空
bool StackEmpty(SqStack S){
if(S.top==-1) return true;
else return false;
}
进栈
bool Push(SqStack &S, ElemType &e){
if(S.top==MaxSize-1) //栈满,报错
return false;
S.data[++S.top]=e; //指针先加1,再入栈
return true;
}
出栈
bool Pop(SqStack &S, ElemType &e){
if(S.top==-1) //栈空,报错
return false;
e=S.data[S.top--]; //先出栈,指针再减1
return true;
}
读栈顶元素
bool GetTop(SqStack &S, ElemType &e){
if(S.top==-1) //栈空,报错
return false;
e=S.data[S.top]; //e记录栈顶元素
return true;
}
动态分配
存储类型
#define Stack_Init_Size 100 //初始化最大元素个数
#define STACKINCREMENT 10 //每次增加内存个数
#define overflow -2 //上溢
#define ERROR 0
#define OK 1
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
栈的运算
初始化
int InitStack(SqStack &S){
S.base=(char*)malloc(Stack_Init_Size*sizeof(char));
if(!S.base)
exit(overflow);
S.top=S.base;
S.stacksize=Stack_Init_Size;
return OK;
}
进栈
int Push(SqStack &S, char e){
if(S.top-S.base>=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*(char)); //重新分配内存空间
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
⭐️⭐️⭐️手机记笔记真累,下次再写🥸⭐️⭐️⭐️