数据结构 栈(四则表达式)
来源:互联网 发布:小米平板2 ubuntu 编辑:程序博客网 时间:2024/05/23 21:55
#include "stdio.h"#define MAXSIZE 20#define max_size 30typedef struct {int data[MAXSIZE];int top;}NumberStack,*pNumberStack;//数字栈typedef struct {char data[MAXSIZE];int top;}SymbolStack,*pSymbolStack;//符号栈void Init_Number(pNumberStack S); //初始化数字栈void Init_Symbol(pSymbolStack S); //初始化符号栈bool Push_Number(pNumberStack S,int val); //进栈bool Push_Symbol(pSymbolStack S,char val);//进栈bool Pop_Number(pNumberStack S,int *pVal);//出栈bool Pop_Symbol(pSymbolStack S,char *pVal);//出栈bool Get_Number(pNumberStack S,int *pVal);//得到栈顶元素bool Get_Symbol(pSymbolStack S,int *pVal); //得到栈顶元素bool is_number(char c);//当前字符是否为数字bool is_symbol(char c);//当前字符是否为符号int Priority(char c){if(c=='*'||c=='/'||c=='%'){return 2;}else {return 1;}}void Init_Number(pNumberStack S){S->top = -1;}void Init_Symbol(pSymbolStack S){S->top = -1;}bool Push_Number(pNumberStack S,int val){if(S->top == MAXSIZE-1){return false;}else{S->data[++S->top] = val;return true;}}bool Push_Symbol(pSymbolStack S,char val){if(S->top == MAXSIZE-1){return false;}else{S->data[++S->top] = val;return true;}}bool Pop_Number(pNumberStack S,int *pVal){if(S->top == -1){return false;}else{*pVal = S->data[S->top--];return true;}}bool Pop_Symbol(pSymbolStack S,char *pVal){if(S->top == -1){return false;}else{*pVal = S->data[S->top--];return true;}}bool Get_Number(pNumberStack S,int *pVal){if(S->top == -1){return false;}else{*pVal = S->data[S->top];return true;}}bool Get_Symbol(pSymbolStack S,char *pVal){if(S->top == -1){return false;}else{*pVal = S->data[S->top];return true;}}bool is_number(char c){if(c>='0'&&c<='9'){return true;}elsereturn false;}bool is_symbol(char c){if(c<='0'||c>='9'){return true;}elsereturn false;}void main(){SymbolStack symbolStack;Init_Symbol(&symbolStack);int i=0, j=0;char cval;//用来取得栈顶元素char s[max_size]="9+2*5-2+(3+2-2*2)*3+8/2-4/2+8";char s2[max_size];//保存后缀表达式/**将中缀表达式转换为后缀表达式*/while(i<max_size-1){if(is_number(s[i]))//是数字{s2[j++]=s[i];//保存数字}else//不是数字{if(symbolStack.top==-1)//栈空,{Push_Symbol(&symbolStack,s[i]); //直接进栈}else //栈不空{if(s[i]!=')') //当前字符不为 ){if(s[i]=='(') //当前字符为 ( 则直接进栈{Push_Symbol(&symbolStack,s[i]);} else //当前字符不为 (或 ){Get_Symbol(&symbolStack,&cval);//得到栈顶元素if(cval =='(') //栈顶元素是 ( 则直接进站{Push_Symbol(&symbolStack,s[i]);}else{if(Priority(cval)<Priority(s[i])) //进行优先级比较 当前元素大于栈顶元素直接进站{Push_Symbol(&symbolStack,s[i]);}else //否则出栈{Pop_Symbol(&symbolStack,&cval);s2[j++]=cval;Get_Symbol(&symbolStack,&cval);//得到栈顶元素//注:出栈后还要判断当前栈顶是否和当前元素等级大,或者相同,则还要继续出栈。while(Priority(cval)>=Priority(s[i])&&symbolStack.top!=-1&&cval!='('){Pop_Symbol(&symbolStack,&cval);s2[j++]=cval;Get_Symbol(&symbolStack,&cval);//得到栈顶元素}//栈内元素出完栈之后,当前元素进栈Push_Symbol(&symbolStack,s[i]);}}}}else //s[i]是)则出栈{Get_Symbol(&symbolStack,&cval);while (cval !='(')//出栈一直到栈顶元素为({Pop_Symbol(&symbolStack,&cval);//printf("出栈元素:%c\n",cval);s2[j++]=cval;Get_Symbol(&symbolStack,&cval);}// 让栈顶元素(也出栈 ,但不保存Pop_Symbol(&symbolStack,&cval);}}}i++;}while(symbolStack.top!=-1){Pop_Symbol(&symbolStack,&cval);s2[j]=cval;j++;}//打印后缀表达式printf("后缀表达式:(%s)\n",s2); /***对后缀表达式进行操作*****///定义并初始化数字栈NumberStack numberStack;Init_Number(&numberStack);int number1,number2;//用来保存出栈的元素int result;//保存出栈元素操作之后的值 i=0;while(i<max_size-1){if(is_number(s2[i])){Push_Number(&numberStack,s2[i]-'0');//将字符转换成数字进栈}else{Pop_Number(&numberStack,&number2);Pop_Number(&numberStack,&number1);switch(s2[i]){case '+': result = number1+number2;break;case '-': result = number1-number2;break;case '*': result = number1*number2;break;case '/': result = number1/number2;break;case '%': result = number1%number2;break;}Push_Number(&numberStack,result);}i++;}Pop_Number(&numberStack,&result);printf("%s=%d\n",s,result);}
/*
自己写的存在一些不足,欢迎拍砖
*/
0 0
- 数据结构 栈(四则表达式)
- 数据结构之栈的应用——四则表达式求值
- 大话数据结构——栈的应用四则元算表达式求值(后缀表达式计算结果)
- 四则表达式
- 计算四则混合运算表达式(不用栈)
- 栈的应用——四则表达式
- 后缀表达式+栈的应用=四则表达式运算
- 栈的应用——四则表达式求值
- 栈的应用——四则表达式求值
- 栈的应用——四则表达式求值
- 四则混合运算C++代码(中缀表达式)
- 四则表达式计算(stl stack, 不带注释)
- 四则(栈or二叉树)
- c++利用栈简单实现四则中缀表达式转后缀表达式,并算值。
- C++用后缀表达式(逆波兰)求四则表达式值,采用STL中的stack
- 四则
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- 计算四则表达式(中缀式转后缀式,然后计算结果)
- opencv2.4.4+VS2010配置
- Android开源客户端之LookAround学习(四) 收尾
- VSS RSS PSS USS
- POJ3253 Fence Repair 小顶堆+贪心
- Utilities and SDK for Subsystem for UNIX-based Applications in Windows 8 and Windows Server 2012
- 数据结构 栈(四则表达式)
- 【c++系列14】让数据类型成为对象
- Maven镜像地址收集
- Pat(Advanced Level)Practice--1061(Dating)
- ubuntu 163 mirrors
- OCP-1Z0-051 第80题 DATE数据类型
- Config程序配置文件操作实践进阶之ConfigurationSectionGroup
- Html文档解析器 HtmlCleaner 编辑
- 学习笔记之三 获取系统时间的方法汇总