nyoj-257-郁闷的C小加(一 )中缀式变后缀式
题目链接:here~~~~~~~
今天看了此题,感觉栈和队列很好用,进一步深入了解
一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+、-、*,以及括号,求表达式的值。
给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后缀表达式,那么对后缀表达式求值将会很方便。
后缀表达式特点:
1.操作符位于操作数之后;
2.没有括号;
3.运算符没有优先级。
中缀表达式转化为后缀表达式的步骤:
1.初始化一个空操作符栈和空结果字符串;
2.从前到后读取中缀表达式的字符,如果是操作数,加到结果字符串后面;
3.如果是操作符,分两种情况入栈:
a.如果待入栈操作符优先级大于栈顶操作符,直接入栈;
b.如果待入栈操作符优先级小于或等于栈顶操作符,栈顶操作符加到结果字符串后面;重复b过程直到遇到前括号‘(’或栈顶操作符优先级比待入栈操作符小,待入栈操作符入栈。
4.如果是前括号‘(’,直接入栈;
5.如果是后括号,将栈中操作符依次弹出,直至遇到一个前括号‘(’结束。前括号出栈。
最后结果字符串就是后缀表达式。
后缀表达式求值的步骤:
1.初始化一个空操作数栈;
2.从前到后读取后缀表达式字符。如果是操作数直接入栈。如果读到一个操作符@,弹出栈顶元素a和新的栈顶元素b,执行b @ a,将结果压入栈中;
3.最后栈中只剩下一个元素,即表达式的值。
原链接 :http://www.cnblogs.com/xiaofanke/archive/2013/05/29/3106391.html
经典的数据结构题,用栈跟队列模拟。
中缀式变后缀式:
stack optr;用来存放运算符栈。队列queue opnd用来存放后缀表达式。
从左到右扫描中缀表达式,是操作数就放进队列 opnd的末尾。
如果是运算符的话,分为下面3种情况:
(1)如果是‘(’直接压入optr栈。
(2)如果是‘)’,依次从optr栈弹出运算符加到队列 opnd的末尾,直到遇到'(';
(3) 如果是非括号,比较扫描到的运算符,和optr栈顶的运算符。如果扫描到的运算符优先级高于栈顶运算符
则,把运算符压入栈。否则的话,就依次把栈中运算符弹出加到队列 opnd的末尾,直到遇到优先级低于扫描
到的运算符或栈空,并且把扫描到的运算符压入栈中。
就这样依次扫描,知道结束为止。
如果扫描结束,栈中还有元素,则依次弹出加到队列 opnd的末尾,就得到了后缀表达式。
原链接:点击打开链接
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
using namespace std;
queue<char> Q;
stack<char> S;
int priority(char s)
{if(s=='+'||s=='-') return 1;if(s=='*'||s=='/') return 2;if(s=='(') return 0;return -1;
}
int main()
{int n,i,l;char str[1100];S.push('#');scanf("%d",&n);while(n--){getchar();scanf("%s",str);l=strlen(str);for(i=0;i<l;i++){if(str[i]>='0'&&str[i]<='9') Q.push(str[i]);else if(str[i]=='(') S.push(str[i]);else if(str[i]==')'){while(S.top()!='('){Q.push(S.top());S.pop();}S.pop();}else{while(priority(S.top())>=priority(str[i])){Q.push(S.top());S.pop();}S.push(str[i]);}}while(S.top()!='#'){Q.push(S.top());S.pop();}while(!Q.empty()){printf("%c",Q.front());Q.pop();}printf("\n");}
}
nyoj-257-郁闷的C小加(一 )中缀式变后缀式相关推荐
- NYOJ 257 郁闷的C小加(一)
郁闷的C小加(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操 ...
- NYOJ 467 中缀式变后缀式
中缀式变后缀式 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...
- NYOJ 409 郁闷的C小加(三)
郁闷的C小加(三) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)&quo ...
- NYOJ 267 郁闷的C小加(二)
郁闷的C小加(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)&quo ...
- NYOJ409 郁闷的c小加三
传送门:http://acm.nyist.net/JudgeOnline/problem.php?pid=409 NYOJ郁闷的c小加一.二.三都是关于表达式转换及求值的,主要涉及栈知识点.郁闷的c小 ...
- NYOJ 236 心急的C小加
心急的C小加 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间 ...
- nyoj 236 心急的C小加(偏序集问题)
描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需 ...
- nyoj 1272 表达式求值(中缀式转后缀式)
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...
- 中缀变后缀(nyoj)
中缀式变后缀式 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...
最新文章
- 敏捷软件开发--计划
- token 案例,只是测试,功能并不完善(只是看看token 到底是何方神圣)
- 一般一个前端项目完成需要多久_一种按周迭代的敏捷式项目管理方法
- java - 菱形输出
- SVM与feature
- boost::asio向socket中异步读写数据
- 实验四【bx】和loop的使用
- 学了python的感悟_初学python之感悟
- windows mysql memcached,Windows上的Memcached(不是memcache)PHP扩展
- linux查看u盘的分区格式化,linux U盘格式化ext3
- android Aidl原理分析
- C语言输出平行四边形,菱形
- 1、RPC框架解析:开篇-什么是RPC?
- 网络和http协议理论
- uniapp小程序文字与语音互相转化
- 计算机毕业设计Java网上租房管理(源码+系统+mysql数据库+Lw文档)
- 工作流-jbpm入门例子
- 幽门螺旋杆菌反反复复,该怎么办?
- 房产证.房屋他项权证.车辆登记证.报到证.企业资质等图片展览.
- 百度推广——搜索营销新视角