一:堆栈的引入
堆栈可以比较好的解决后缀表达式的问题。
拓展一:
中缀表达式:运算符号位于两个运算数之间;例如a + b * c - d/c;
后缀表达式:运算符号位于两个运算数之后;例如ab * + de -;
这个时候就需要一种存储办法,能够顺序存储运算数,并在需要的时候倒序输出,这就需要堆栈。
二、堆栈的概念
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。
堆栈的存储过程像一个堆碟子的过程,旧的碟子堆在下面,新碟子堆在上面,拿碟子的过程,也是先拿新碟子,最后才能拿到旧碟子。
三、堆栈的链表实现
#include<stdio.h> #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"); }
运行结果图
原文地址:https://www.cnblogs.com/changfan/p/11695212.html
时间: 2024-10-29 04:57:21