博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
---中缀表达式转换为后缀表达式---模拟计算器-----堆栈
阅读量:6083 次
发布时间:2019-06-20

本文共 1818 字,大约阅读时间需要 6 分钟。

中缀表达式转换为后缀表达式是堆栈的一个典型例题 . 

→ 从头到尾读取中缀表达式的每个对象,对不同的对象按照不同的情况处理.

①运算数:直接输出;

②左括号:压入堆栈;

③右括号:将栈顶的元算服弹出并输出直到遇见左括号(出栈不输出);

④运算符:

       若优先级大于栈顶运算符时压栈;

       若优先级小于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,知道该运算符大于栈顶运算符优先级为止,然后将运算符压栈;

⑤若各对象处理完毕,则把堆栈中保留的运算符一并输出.\        

      堆栈有很多的用途,例如函数的调用,在调用函数的的时候,就将调用函数的上一层储存到  栈里面,,所以当用函数的递归的时候就会占用很多的内存,容易导致崩溃,,,前面说过这个问题的例子.

下面附上实现代码

可能看起来比较困难一点,但是不要着急,先看看混个脸熟

#include
#include
#include
#include
using namespace std;char a[1010];char b[1010];stack
s1;stack
s2;int i,j,n,m,t;float x,y,z;int fun(char x){ switch(x) { case '+' : case '-' :return 1; case '*' : case '/' :return 2; case '(' :return 0; default :return -1; }}float js(float x,float y,char z){ switch(z) { case '+':return y+x; case '-':return y-x; case '*':return y*x; default :return y/x; }}int main(){ int p; char c[1010]; float d; scanf("%d",&t); s1.push('#'); while(t--) { j=0; scanf("%s",a); m=strlen(a)-1; for(i=0;i
='0'&&a[i]<='9'||a[i]=='.') { memset(c,0,sizeof(c)); p=0; while(a[i]>='0'&&a[i]<='9'||a[i]=='.') { b[j++]=a[i]; c[p++]=a[i++]; } d=atof(c); s2.push(d); i--; } else if(a[i]=='(') s1.push(a[i]); else if(a[i]==')') { while(s1.top()!='(') { b[j++]=s1.top(); x=s2.top();s2.pop(); y=s2.top();s2.pop(); x=js(x,y,b[j-1]); s2.push(x); s1.pop(); } s1.pop(); } else { while(fun(s1.top())>=fun(a[i])) { b[j++]=s1.top(); x=s2.top();s2.pop(); y=s2.top();s2.pop(); x=js(x,y,b[j-1]); s2.push(x); s1.pop(); } s1.push(a[i]); } } while(s1.top()!='#') { b[j++]=s1.top(); x=s2.top();s2.pop(); y=s2.top();s2.pop(); x=js(x,y,b[j-1]); s2.push(x); s1.pop(); } b[j]='='; b[j+1]='\0'; puts(b); printf("%.2f\n",s2.top()); s2.pop(); } return 0;}

 

堆栈的应用:

→函数调用以及递归实现

→深度优先搜索

→回朔算法

→.....

 

 

转载于:https://www.cnblogs.com/A-FM/p/5104543.html

你可能感兴趣的文章
subline 快捷键与功能解释
查看>>
Ubuntu+apache安装redmin
查看>>
使用mysqldump迁移数据
查看>>
路径问题
查看>>
shiro 静态页面资源不显示 解决方案
查看>>
[转] PostgreSQL学习手册(数据表)
查看>>
HDU-1159 Common Subsequence(动态规划2)
查看>>
spl_autoload_register更改框架文件引用模式
查看>>
diff文件生成小记
查看>>
RN中有两种方式使用全局变量
查看>>
处理 Oracle SQL in 超过1000 的解决方案
查看>>
maven项目在eclipse的library中没有Maven Dependencies
查看>>
RN初始化环境快速配置
查看>>
10.Lambda表达式入门
查看>>
maven jar 导入本地仓库
查看>>
ExtentTestNGIReporterListener
查看>>
UIView
查看>>
Layer Filters
查看>>
微信小程序 解决 数字粗细不一 的bug
查看>>
mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
查看>>