后缀表达式做计算器程序

概念:

后缀表达式是相较于中缀表达式而言的,像我们平时写的2+3*(4-(5+6))/7就是一个中缀表达式,那么如何将之变为后缀表达式呢?后缀表达式如何用来求解呢?

先来第一个问题(中缀->后缀):

变为后缀表达式方法(规则):

1.遇到操作数:直接添加到后缀表达式中

2.栈为空时,遇到运算符,直接入栈

3.遇到左括号:将其入栈

4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。

5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈。

6.最终将栈中的元素依次出栈,输出。

用一个实例来分析:

X = 2+3*(4-(5+6))/7

1、遇到操作数2,添加到后缀表达式中                                                             2 (此时的后缀表达式,下同)

2、栈为空,遇到加号‘+’,将‘+’入栈                                                          2

3、遇到操作数3,添加到后缀表达式中                                                             23

4、遇到操作符‘*’,栈顶为‘+’,‘*’优先级大于‘-’,不出栈,‘*’入栈         23

5、遇到左括号‘(’,直接入栈。                                                                        23

6、遇到操作数4,添加到后缀表达式中                                                             234

7、遇到减号‘-’,栈顶为‘(’,‘-’入栈                                                                   234

8、遇到左括号‘(’,直接入栈。                                                                         234

9、遇到操作数5,添加到后缀表达式中                                                              2345

10、遇到加号‘+’,栈顶为‘(’, ‘+’入栈                                                      2345

11、遇到操作数6,添加到后缀表达式中                                                            23456

12、遇到右括号‘)’(不入栈),出栈‘+’,出栈‘(’(不添加到后缀表达式中)      23456+

13、遇到右括号‘)’(不入栈),出栈‘-’,出栈‘(’(不添加到后缀表达式中)       23456+-

14、遇到‘/’,栈顶为‘*’, ‘/’优先级大于‘*’,将‘*’出栈                                              23456+-*

15、遇到操作时7,添加到后缀表达式中                                                            23456+-*7

16、把栈中剩下的符号都出栈                                                                             23456+-*7/+

代码实现:

char* postfix_expression(string str)
{
	char *temp=new char(100);
	int j=0;
	for(int i=0; i<str.size(); i++)
	{
		if(str[i]>=‘0‘ && str[i]<=‘9‘)
			temp[j++]=str[i];
		else
		{
			if(str[i]==‘)‘)
			{
				while(S_c.top()!=‘(‘)
				{
					temp[j++] = S_c.top();
					S_c.pop();
				}
				S_c.pop();
			}
			//如果符号是*或/高优先级,弹出所有*和/
			else if(str[i]==‘*‘||str[i]==‘/‘)
			{
				if(!S_c.empty())
					if(S_c.top()==‘*‘||S_c.top()==‘/‘)
					{
						temp[j++] = S_c.top();
						S_c.pop();
					}
				S_c.push(str[i]);
			}
			//如果符号是+或-低优先级,弹出所有*/+-
			else if(str[i]==‘+‘||str[i]==‘-‘)
			{
				if(!S_c.empty())
					if(S_c.top()==‘*‘||S_c.top()==‘/‘||S_c.top()==‘+‘||S_c.top()==‘-‘)
					{
						temp[j++] = S_c.top();
						S_c.pop();
					}
				S_c.push(str[i]);
			}
			else
				S_c.push(str[i]);
		}
	}
	while(!S_c.empty())
	{
		temp[j++] = S_c.top();
		S_c.pop();
	}
	return temp;
}

  

第二个问题,如何使用后缀表达式来解表达式

后缀表达式已经将计算的优先顺序排好,只需要将后缀表达式的数字逐个入栈,直到遇到符号,将前栈顶两个元素运算放回栈顶即可。

以上面的后缀表达式为例:

23456+-*7/+

 

上代码~

#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;

stack<int> S_n;
stack<char> S_c;
//上面的后缀表达式转换函数
char* postfix_expression(string str);

int main()
{
	string str;
	char *pe;
	int temp;
	cin>>str;
	//将str转为后缀表达式
	pe = postfix_expression(str);
	for(int i=0; i<strlen(pe); i++)
	{
		if(pe[i]>=‘0‘&&pe[i]<=‘9‘)
		{
			S_n.push(pe[i]-‘0‘);
		}
		else if(pe[i]==‘*‘)
		{
			temp = S_n.top();
			S_n.pop();
			temp *= S_n.top();
			S_n.pop();
			S_n.push(temp);
		}
		else if(pe[i]==‘/‘)
		{
			temp = S_n.top();
			S_n.pop();
			temp = S_n.top()/temp;
			S_n.pop();
			S_n.push(temp);
		}
		else if(pe[i]==‘+‘)
		{
			temp = S_n.top();
			S_n.pop();
			temp += S_n.top();
			S_n.pop();
			S_n.push(temp);
		}
		else if(pe[i]==‘-‘)
		{
			temp = S_n.top();
			S_n.pop();
			temp = S_n.top()-temp;
			S_n.pop();
			S_n.push(temp);
		}
	}
	cout<<pe<<endl;
	cout<<S_n.top()<<endl;
	return 0;
}

运行结果:

原文地址:https://www.cnblogs.com/kamicoder/p/8593627.html

时间: 2024-11-02 11:48:57

后缀表达式做计算器程序的相关文章

前缀、中缀、后缀表达式以及简单计算器的实现

前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面.为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”.例如,- 1 + 2 3,它等价于1-(2+3). 中缀表达式 中缀表达式就是一般的算数表达式,操作符以中缀形式出现在操作数之间. 后缀表达式 后缀表达式指

【转】前缀、中缀、后缀表达式

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计

java四则运算----前缀、中缀、后缀表达式

接到一个新需求,需要实现可配置公式,然后按公式实现四则运算. 刚拿到需求,第一反应就是用正则匹配‘(’,‘)’,‘+’,‘-’,‘*’,‘/’,来实现四则运算,感觉不复杂. 然后开始coding.发现有点复杂,然后各种for,感觉非常不爽,于是问网上搜了下,发现一种叫波兰式的计算方法,瞬间茅塞顿开. http://blog.csdn.net/antineutrino/article/details/6763722 以下为原文引用 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.

前缀、中缀、后缀表达式及其求值

它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前:中缀和后缀同理. 比如: (4 + 5) × 6- 7 就是中缀表达式 - × + 4567 前缀表达式 45 + 6×7 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

后缀表达式实战:Qt制作计算器

导言 相信学过数据结构的人都听说过后缀表达式,就是在学习栈的时候.可能也有很多人实现过这一算法,不过基本上也都是在控制台窗口里用用.相信大家也都用过计算器windows里面的calc.但是有没发现它只能单步计算,而不能一次计算一个表达式.后缀表达式就有了用武之地,可以一次性计算一整个个式子.科技要为生产服务,所以我就实际去做了一个依据后缀表达式的带有图形化界面的计算器. 什么是后缀表达式 后缀表达式又称逆波兰式,用于简化计算数学表达式,是计算器类软件开发的重要理论依据.这部分有两个要点: 中缀表

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack =

后缀表达式(逆波兰表达式)计算器

package datastructure.stack; import java.util.*; /** * <h3>netty_lecture</h3> * <p>逆波兰计算器</p> * 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1 * @author : myron * @date : 2020-03-18 23:48 **/ public class PolandNotation { private static fi