codeup26854 中缀表达式的值

20人阅读 评论(0) 收藏 举报
分类:

codeup26854  中缀表达式的值

时空限制    1000ms/128MB

题目描述

    模拟计算机处理算术表达式过程。从键盘上输入算术表达式串(只含+、-、×、÷运算符,允许含括号),输出算术表达式的值。设输入的表达式串是合法的,且只包含整数。

输入

    一行,中缀表达式,长度不超过255,以“@”结束。

输出

    中缀表达式的值。

样例输入

4+5-9+10*2@

样例输出

20


分析

字符串逐个字符扫描

当前字符是  左括号时,左括号直接入运算符栈

当前字符是  右括号时,运算符出栈,直到遇到左括号,每一个运算符出栈,都要从数字栈里出两个数字进行计算,结果压入数字栈

当前字符是  数字时,计算数值,值入数字栈

当前字符是  运算符时

            当前字符优先级 <= 运算符栈顶运算符优先级    运算符栈 出栈 计算,直到当前字符优先级 > 运算符栈顶运算符优先级,或运算符栈空,当前运算符入栈。


代码

#include<iostream>
#include<string>
#include<stack>
#include<cctype>
using namespace std;
string s;
stack<int> snum;
stack<char> ssym;

void calculate(){    //计算
	int x=snum.top(); snum.pop();	//数字栈弹出一个值
	int y=snum.top(); snum.pop();	//数字栈弹出一个值
	switch (ssym.top()){	//运算符栈弹出运算符
		case '+': y+=x; break;
		case '-': y-=x; break;
		case '*': y*=x; break;
		case '/': y/=x; break;
	}
	snum.push(y);	//运算后值入栈
	ssym.pop();		//运算符栈出栈
}

bool isbig(char ch){	//当前运算符s[i]  是否大于  运算符栈顶运算符
	if (ssym.empty()) return true;	//运算符栈空
	int now,sta;
	if (ch=='+' || ch=='-') now=1;	//当前运算符优先级,+-为1,*/为2
	else now=2;
	if (ssym.top()=='(') sta=0;		//运算符栈栈顶,(优先级0
	else if (ssym.top()=='+' || ssym.top()=='-') sta=1;
	else sta=2;
	return now>sta;
}

int main(){
	cin>>s;
	for (int i=0,len=s.size()-1; i<len; ){
		if (s[i]=='(') ssym.push(s[i]),i++;	//左括号直接入栈
		else if (s[i]==')'){	//右括号
			while (ssym.top()!='(') calculate();	//最近一次左括号后运算符符出栈
			ssym.pop();	//最近一次左括号出栈
			i++;	//跳过当前右括号
		}
		else if (isdigit(s[i])){	//数字,计算值
			int x=0;
			while (isdigit(s[i])) x=10*x+s[i++]-'0';
			snum.push(x);	//数字入栈
		}
		else {	//运算符
			while (!isbig(s[i])) calculate();	//当前运算符s[i]  <=  运算符栈顶运算符  运算符出栈
			ssym.push(s[i]);	//当前运算符入栈
			i++;
		}
	}
	while (!ssym.empty()) calculate();	//情况运算符栈
	cout<<snum.top()<<endl;
	return 0;
}
查看评论

poj 中缀表达式的值

好久没写代码了,这种100行的竟然RE了好几次,真是智商捉急~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 呐,本题分两步进行。 我是先用栈op来完成中缀到后缀表达式的转换...
  • u012874151
  • u012874151
  • 2013-12-21 00:55:41
  • 805

中缀表达式的求值(栈实现)

  • 2009年08月05日 18:33
  • 1KB
  • 下载

OpenJudge题目解析-中缀表达式的值

题目描述中缀表达式的值http://stepbystep.openjudge.cn/stackqueue/10/思路要点 输入字符串,而后解析得到操作符和操作数(用字符串数组存储) 利用操作符栈和操作...
  • yedouble
  • yedouble
  • 2015-09-23 09:08:14
  • 406

栈的应用:求中缀表达式的值。

栈的应用:求中缀表达式的值。      数据结构实训,数据结构课本上关于这个有一个标准伪码,没看过。      这个算法以前做题的时候遇到过,这次测试的时候很幸运的发现了在之前实现过程中一个没有理...
  • weixinwei021
  • weixinwei021
  • 2014-01-17 01:31:01
  • 649

栈实现中缀表达式的值

#include &amp;lt;iostream&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;algorithm&amp;gt;...
  • lfb637
  • lfb637
  • 2017-10-20 21:34:32
  • 139

递归方法计算一个中缀表达式的值

编写程序计算诸如 (7+2)/3-5*2+12*(4+3) 这种表达式的值。
  • cain4578369
  • cain4578369
  • 2017-08-06 14:54:09
  • 423

栈的应用——中缀表达式求值

这是一篇有关数据结构的文章,(因为数据结构学的很差,所以多练习一下)栈是一种比较重要也是比较基础的数据结构,它很灵活,最大的特点是元素先进先出。有关栈的详细知识可以移步百度百科:栈。 比如说,你想做...
  • weixin_39740796
  • weixin_39740796
  • 2017-08-18 15:20:51
  • 506

输入中缀或后缀表达式,输出值

输入中缀或后缀表达式,输出值。 思路: 先将中缀表达式转化成后缀表达式,然后扫描。设置两个栈,一个操作符栈,根据优先级决定是否入栈,一个操作数栈,然后定义一个栈,将操作数转化成后缀式,进行计算。 #i...
  • u010857889
  • u010857889
  • 2017-02-20 20:09:56
  • 355

c++ 中缀表达式转后缀表达式并计算值

什么是中缀表达式, 前缀表达式, 后缀表达式? 在数据结构中, 二叉树的遍历有三种(这里不考虑分层遍历等特殊需求): 前序遍历, 中序遍历和后序遍历. 如果将表达式看做一颗二叉树, 那么中缀表达式, ...
  • lbcab
  • lbcab
  • 2016-06-07 13:26:11
  • 4855

中缀表达式转后缀表达式求值(栈的应用)

咱们熟悉的四则运算表达式,中缀表达式,例如 (12+3)*2-6/2 利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到表达式的值   ...
  • l04205613
  • l04205613
  • 2012-07-28 20:47:14
  • 5653
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2862
    排名: 1万+
    文章存档
    最新评论