nyoj-257-郁闷的C小加(一 )中缀式变后缀式

2024-05-28 02:48

本文主要是介绍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小加(一 )中缀式变后缀式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009330

相关文章

nyoj 288 士兵杀敌(五)

一道插线问线离线版的题  复杂度O(n); 代码如下: #include<stdio.h>#include<string.h>const int M = 1000003;const int mod=10003;int num[M];int main(){int n,c,q;scanf("%d%d%d",&n,&c,&q);while(c--){int a,b,x;scan

nyoj 1037 Postscript of Tian Ji racing

一道卡贪心的题。 也算一道改编题。 此题的解法推荐为二分图的最大匹配。 首先将输入数据转换一下,然后将满足题意的一组牌建立条边,最终边的覆盖数即为 LN 最后可得的分数。 然后求出最大匹配即可。 代码如下: #include<stdio.h>#include<string.h>char card[30][5];char s[5];int map[30][30];

nyoj 1002 Trucking

同样一道改编题。 只要把题意理解了好。 简单的二分加最短路。 只要二分高度, 然后求最短路,输出满足题意的即可。 代码如下: (最短路用spfa 时间效率高) #include <iostream>#include <cstdio>#include <cstring>#include <ctime>#include <queue>using namespace st

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

nyoj 695 Judging Filling Problems

一道强大的模拟题。。。 只要学会<string>类的运用即可。。。 注意: 1、细节的处理。 2、问题的分情况讨论。。 附上代码: 有好对缀余的地方,希望大神前来更新。 #include<stdio.h>#include<string.h>#include<string>#include<iostream>using namespace std;int num[1000

将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果

最近因为需要了解如何将在Win应用程序控制台输入的算式表达式转化成其后缀表达式的算法,所以在网上搜索了一下,看到许多人的程序都只是对应于运算数在0~9的范围内的整型运算式,所以自己就写了一个可以计算浮点型算式的程序,一下是运行时的截图: 式子中的a,b,c是可供用户自行输入的变量。 首先,我先对输入的运算符进行了简单的合法性判断,我的判断代 码如下: //函数的传入参

后缀表达式转中缀表达式

假定有后缀表达式1 2 3 + 4 * +5 – ,请将它转化为前缀表达式。 利用表达式树: 1.从左到右扫面后缀表达式,一次一个符号读入表达式。2.如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两个树T1和T2(T1先弹出)并形成一颗新的树,该树的根就是操作符,它的左、右儿子分别是T2和T1(先出的为右子树,后出的为左子树)。然后将指向这棵新树的指

NYOJ 37 回文字符串(记忆化搜索)

OJ题目 : 戳这里~~ 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.