一:堆栈的引入
堆栈可以比较好的解决后缀表达式的问题。
拓展一:
中缀表达式:运算符号位于两个运算数之间;例如a + b * c - d/c;
后缀表达式:运算符号位于两个运算数之后;例如ab * + de -;
这个时候就需要一种存储办法,能够顺序存储运算数,并在需要的时候倒序输出,这就需要堆栈。
二、堆栈的概念
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。
堆栈的存储过程像一个堆碟子的过程,旧的碟子堆在下面,新碟子堆在上面,拿碟子的过程,也是先拿新碟子,最后才能拿到旧碟子。
三、堆栈的链表实现
#include<stdlib.h>
typedef int Elementtype;
//定义节点
typedef struct Node{
Elementtype Element;
struct Node *next;
}NODE,*PNODE;
//定义栈的结构体
typedef struct Stack{
PNODE PTOP;
PNODE PBOOTOM;
}STACK,* PSTACK;
void InitStack(PSTACK Stack);
void PushStack(PSTACK Stack,int val);
void PopStack(PSTACK Stack,int *val);
void TraverseStack(PSTACK Stack);
bool IsEmpty(PSTACK Stack);
void ClearStack(PSTACK Stack);
int main(){
STACK Stack;
int val = 0;
InitStack(&Stack);
IsEmpty(&Stack);
PushStack(&Stack,100);
PushStack(&Stack,100);
PushStack(&Stack,100);
PushStack(&Stack,100);
IsEmpty(&Stack);
PopStack(&Stack,&val);
TraverseStack(&Stack);
ClearStack(&Stack);
return 0;
}
void InitStack(PSTACK Stack){
PNODE PNew = (PNODE)malloc(sizeof(NODE));
if(PNew == NULL){
printf("新结点空间的分配失败!");
exit(-1);
}
Stack->PTOP = PNew;
Stack->PBOOTOM = PNew;
PNew->next = NULL;
printf("栈创建成功!\n");
}
void PushStack(PSTACK Stack,int val){
PNODE P = (PNODE)malloc(sizeof(NODE));
if(P == NULL){
printf("新结点空间的分配失败!");
exit(-1);
}
P->Element=val; //将值赋给结点的赋值域
P->next = Stack->PTOP; //使新建的结点指向上一个结点
Stack->PTOP = P; //更新栈顶元素,使其指向新的结点
}
void PopStack(PSTACK Stack,int *val){
if(Stack->PBOOTOM == Stack->PTOP){
printf("栈已空");
}
PNODE P = Stack->PTOP;
*val = P->Element;
Stack->PTOP = P->next;
free(P);
P = NULL;
printf("%d 已出栈!\n",*val);
}
void TraverseStack(PSTACK Stack){
if (IsEmpty(Stack)){
printf("遍历栈失败,栈已空!\n");
}
PNODE P = Stack->PTOP;
printf("遍历栈中的元素为:");
while(P != Stack->PBOOTOM){
printf("%d\n",P->Element);
P = P->next;
}
}
bool IsEmpty(PSTACK Stack){
if(Stack->PTOP == Stack->PBOOTOM){
printf("栈为空!\n");
return true;
}
else{
return false;
}
}
void ClearStack(PSTACK Stack){
if(IsEmpty(Stack)){
printf("栈为空,无需再清除!\n");
}
PNODE P = Stack->PTOP;
PNODE S = NULL;
while(P != Stack->PBOOTOM){
S = P->next;
free(P);
P = S;
}
Stack->PTOP = Stack->PBOOTOM;
printf("栈已清空!\n");
}
知识兔运行结果图