1、演示堆栈过程#include #include #include #include #define MAX 100char stockMAX;int top=-1;char aMAX,bMAX;char exp100;int operand1=0; / 定义操作数int operand2=0; / 定义操作数int result=0; / 定义操作结果变量int pos=0; / 目前表达式位置/ 定义一个节点的结构typedef struct node int member; /数据域 struct node * pNext;/指针域Node,*pNode;/ 定义一个栈结构typedef
2、struct stack pNode Top; /栈顶 pNode Bottom; /栈底Stack,* pStack;void InitStack(pStack ); / 初始化栈的函数bool Push(pStack ,char); / 进行入栈操作的函数void TraverseStack(pStack ); / 遍历栈函数bool Empty(pStack ); / 判断栈是否为空的函数int Pop(pStack ); / 进行出栈操作的函数void Clear(pStack ); / 清空栈的函数void caidan(); /显示菜单void fun( char a,char b
3、); /中序转后序函数int main(void) Stack s; / 定义一个栈 char c; int i; int num; char data; / 临时保存用户输入的数据 char re_num; / 保存Pop函数的返回值 printf(*n); printf(* 1初始化栈 *n); printf(* 2入栈 *n); printf(* 3出栈 *n); printf(* 4遍历栈中元素并显示栈顶元素*n); printf(* 5清空栈 *n); printf(* 6栈的中序转后序 *n); printf(* 7栈后序表达式的计算 *n); printf(* 8退出程序 *n)
4、; printf(* 9显示菜单 *n); printf(*n); while(1) printf(请选择你要进行的操作:); int k; scanf(%d,&k); switch(k) case 1:InitStack(&s);break; case 2:printf(请输入你准备输入数据的个数:); scanf(%d,&num); for (i = 0;i num;i+) printf(第 %d 个字符:,i+1); getchar(c); scanf(%c,&data); if (Push(&s,data) / 调用Push函数 continue; else printf(进行进栈操作
5、失败!n); exit(-1); ;break; case 3:printf(请输入你准备出出栈的字符个数: ); scanf(%d,&data); if (Empty(&s) /判断栈是否为空,为空就不能进行出栈操作 printf(栈已为空!n); else printf(你去掉的数字是:); for (i = 0; i Top = (pNode)malloc(sizeof(Node); / 分配内存空间给栈顶 if (NULL = ps-Top) printf(动态分配内存失败n); exit(-1); else ps-Bottom = ps-Top; / 使栈底也指向栈顶空间 ps-To
6、p-pNext = NULL; / 栈顶指针置为NULL; printf(栈已经进行了初始化!); printf(n); return ;/ 进行入栈操作的函数bool Push(pStack ps,char data) pNode pNew = (pNode)malloc(sizeof(Node); / 定义一个新节点,并分配内存空间 if (NULL = pNew) return false; pNew-member = data; / 把要进栈的数据赋给新节点的member成员 pNew-pNext = ps-Top; / 使新节点的指针指向栈顶 ps-Top = pNew; / 把新节
7、点作为新栈顶 printf(n); return true;/ 遍历栈的函数void TraverseStack(pStack ps) pNode pNew = ps-Top; if (Empty(ps) /判断栈是否为空,为空就不能进行出栈操作 printf(栈已为空!n); else printf(栈顶元素为:); printf(%cn,pNew-member); printf(栈内的元素有:); while(pNew!= ps-Bottom) / 只要栈顶不等于栈底,循环 printf(%c ,pNew-member); / 打印栈顶的成员member pNew = pNew-pNext
8、; / 栈顶指针向下移动一次 printf(n); return ;/ 判断栈是否为空bool Empty(pStack ps) if(ps-Top = ps-Bottom) / 栈顶等于栈底,不就是栈中没数据么 return true; else return false; printf(n);/ 进行出栈操作函数int Pop(pStack ps) pNode pSwap = NULL; int return_val; if (Empty(ps) /判断栈是否为空,为空就不能进行出栈操作 printf(n栈中数据不足无法完整出栈!n); else return_val = ps-Top-m
9、ember; / 把栈顶的成员member的值赋给return_val做为函数返回值 pSwap = ps-Top; / 使pSwap指向栈顶 ps-Top = ps-Top-pNext; / 使栈顶指向栈顶下一个节点 free(pSwap); / 释放以前的栈顶空间 return return_val; printf(n);/ 清空栈的函数void Clear(pStack ps) pNode pNew = NULL; while (ps-Top != ps-Bottom) / 栈顶和栈底不等,循环 pNew = ps-Top; / 使一个新节点和栈顶指向同一空间 ps-Top = ps-T
10、op-pNext; / 使栈顶指向栈顶的下一个节点 free(pNew); / 释放掉以前的栈顶空间 printf(栈已清空!n); return ;/显示菜单函数void caidan() printf(*n); printf(* 1初始化栈 *n); printf(* 2入栈 *n); printf(* 3出栈 *n); printf(* 4遍历栈中元素并显示栈顶元素*n); printf(* 5清空栈 *n); printf(* 6栈的中序转后序 *n); printf(* 7栈后序表达式的计算 *n); printf(* 8退出程序 *n); printf(* 9显示菜单 *n); p
11、rintf(*n);/中序转后序函数void fun( char a,char b) int i,len,j; len=strlen(a); j=-1; for(i=0;i=0&stocktop!=() b+j=stocktop-; stock+top= ; stock+top=ai; break; case *: case /:while(top=0&stocktop!=(&stocktop!=+&stocktop!=-) b+j=stocktop-; stock+top= ; stock+top=ai; break; case):while(stocktop!=() b+j=stockto
12、p-; top-; break; default: b+j=ai; if(i=len-1) b+j= ; break; else if(ai+1=9) b+j= ; while(top=0) b+j=stocktop-; b+j=0; for(i=0;i=j;i+) printf(%c,bi);int getvalue(int op,int operand1,int operand2) / 计算表达式值 char exp100; int operand1=0; / 定义操作数 int operand2=0; / 定义操作数 int result=0; / 定义操作结果变量 int pos=0;
13、 / 目前表达式位置 switch(char)op) case*: return(operand1*operand2); case/: return(operand1/operand2); case+: return(operand1+operand2); case-: return(operand1-operand2); 演示堆栈过程#include#include#include#includevoid Push(int d);int Pop(void);int main(void) int value; char str100; do printf(Enter value); gets(
14、str); if(strcmp(str,pop)!=0) value=atoi(str); Push(value); else printf(value on top is %dn,Pop(); while(strcmp(str,quit)!=0); system(PAUSE); return 0;#define MAXSIZE 100int bottomSP=0;int sp=0;int stackMAXSIZE; void Push(int d) sp+; if(sp=(bottomSP+MAXSIZE); puts(Stack Overflow.n); exit(1); stacksp=
15、d;int Pop(void) if(sp=bottomSP) puts(Stack underflow.n); exit(1); system(PAUSE); return stacksp-;题 目: 后缀表达式求值 #include #include struct node / 栈结构声明 int data; / 数据域 struct node *next; / 指针域 ; typedef struct node stacklist; / 链表新类型 typedef stacklist *link; / 链表指新针类型 link operand=NULL; / 操作数栈指针 void pu
16、sh( int value) / 进栈,存入数据 link newnode; / 新结点指针 newnode=new stacklist; / 分配新结点 if (!newnode) printf(分配失败!); / 存入失败 return ; newnode-data=value; / 创建结点的内容 newnode-next=operand; operand=newnode; / 新结点成为栈的开始 return ; void pop(int *value) / 出栈,取出数据 link top; / 指向栈顶 if (operand !=NULL) top=operand; / 指向栈顶
17、 operand=operand-next; / 移动栈顶指针,指向下一个结点 *value=top-data; / 取数据 delete top; / 吸收结点 else *value=-1; int empty() / 判栈空 实用数据结构基础实验报告 - 3 - if (operand!=NULL) return 1; else return 0; int isoperator(char op) / 判运算符 switch (op) case+: case-: case*: case/: return 1; / 是运算符,返回 default: return 0; / 不是运算符,返回
18、int getvalue(int op,int operand1,int operand2) / 计算表达式值 switch(char)op) case*: return(operand1*operand2); case/: return(operand1/operand2); case+: return(operand1+operand2); case-: return(operand1-operand2); void main() / 主函数 char exp100; int operand1=0; / 定义操作数 int operand2=0; / 定义操作数 int result=0;
19、 / 定义操作结果变量 int pos=0; / 目前表达式位置 printf(tn 请输入后缀表达式:); gets(exp); /cin.getline(exp,81) / 读取后缀表达式 printf(tnn 后缀表达式%s的结果是:,exp); while (exppos !=0 & exppos !=n) / 分析表达式字符串 if (isoperator(exppos) / 是运算符,取两个操作数 pop(&operand2); pop(&operand1); push(getvalue(exppos,operand1,operand2); else push(exppos-48); / 是操作数,压入操作数栈 pos+; / 移到下一个字符串位置 pop(&result); / 弹出结果 - 4 - printf(%dn,result); / 输出
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1