题目链接: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小加(一 )中缀式变后缀式相关推荐

  1. NYOJ 257 郁闷的C小加(一)

    郁闷的C小加(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操 ...

  2. NYOJ 467 中缀式变后缀式

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...

  3. NYOJ 409 郁闷的C小加(三)

    郁闷的C小加(三) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)&quo ...

  4. NYOJ 267 郁闷的C小加(二)

    郁闷的C小加(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)&quo ...

  5. NYOJ409 郁闷的c小加三

    传送门:http://acm.nyist.net/JudgeOnline/problem.php?pid=409 NYOJ郁闷的c小加一.二.三都是关于表达式转换及求值的,主要涉及栈知识点.郁闷的c小 ...

  6. NYOJ 236 心急的C小加

    心急的C小加 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间 ...

  7. nyoj 236 心急的C小加(偏序集问题)

    描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需 ...

  8. nyoj 1272 表达式求值(中缀式转后缀式)

    表达式求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 假设表达式定义为: 1. 一个十进制的正整数 X 是一个表达式. 2. 如果 X 和 Y 是 表达式,则 X+ ...

  9. 中缀变后缀(nyoj)

    中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达 ...

最新文章

  1. 敏捷软件开发--计划
  2. token 案例,只是测试,功能并不完善(只是看看token 到底是何方神圣)
  3. 一般一个前端项目完成需要多久_一种按周迭代的敏捷式项目管理方法
  4. java - 菱形输出
  5. SVM与feature
  6. boost::asio向socket中异步读写数据
  7. 实验四【bx】和loop的使用
  8. 学了python的感悟_初学python之感悟
  9. windows mysql memcached,Windows上的Memcached(不是memcache)PHP扩展
  10. linux查看u盘的分区格式化,linux U盘格式化ext3
  11. android Aidl原理分析
  12. C语言输出平行四边形,菱形
  13. 1、RPC框架解析:开篇-什么是RPC?
  14. 网络和http协议理论
  15. uniapp小程序文字与语音互相转化
  16. 计算机毕业设计Java网上租房管理(源码+系统+mysql数据库+Lw文档)
  17. 工作流-jbpm入门例子
  18. 幽门螺旋杆菌反反复复,该怎么办?
  19. 房产证.房屋他项权证.车辆登记证.报到证.企业资质等图片展览.
  20. 百度推广——搜索营销新视角

热门文章

  1. 重磅 | 神策数据微信生态数字化运营解决方案上线!
  2. 直播回顾 | 数据驱动「产品迭代」的三大场景详解
  3. IBM 火雪挺:人工智能如何影响衣食住行?
  4. Hyper-V群集对群集复制
  5. WPF安装打印机驱动后PrintDialog 执行打印事件
  6. redux-form(V7.4.2)笔记(二)
  7. Silverlight 4 新特性之Silverlight as Drop Target
  8. 【非凡程序员】 OC第十八节课 (数据库mysql和sqlite3)
  9. 批量创建同义词并授权
  10. 加密解密技术—对称算法加密