逆波兰式与表达式求解

/***************
逆波兰式即后缀表示法
  预处理 ———— 中序表达式->逆序表达式(infix to postfix)
	  算法:
	  while(表达式非空)
		if (遇到操作数)
		  直接输出
		else if (遇到操作符op)
		  op是( 直接入栈s
		  op是) s.push输出,直到(
		  op是四则运算,则
			if (s为空 || s.top为( || op 优先级高于 s.top)
			  op 入栈
			else
			  s.push输出
	  if (!s.empty)
		s.push输出
  计算
	  算法:
	  if (遇到操作数)
	      入栈s
	  else (遇到操作符)
	      s.push两个元素进行运算,结果入栈
*******************/
#include <iostream>
#include <stack>
using namespace std;
typedef struct tagCalc
{
	bool is_op;
	union{
		char op;
		int value;
	};

}Calc;
int main()
{
	stack<Calc> s;
	Calc calc;
	int ch;
	while (1)
	{
		while ((ch = getchar()) && ch != '\n')
		{
			if (NULL == strchr("+-*/", ch)) //操作数
			{
				if (strchr("()", ch) == NULL)
					printf("%c", ch);
				if ('(' == ch)
				{
					calc.is_op = 1;
					calc.op = ch;
					s.push(calc);
				}
				else if (')' == ch)
				{
					while (!s.empty())
					{
						calc = s.top();
						s.pop();
						if ('(' == calc.op)
							break;
						printf("%c", calc.op);

					}
				}
			}
			else
			{
				if (s.empty() || s.top().op == '(' || (NULL != strchr("*/", ch) && NULL != strchr("+-", s.top().op)))
				{
					calc.is_op = true;
					calc.op = ch;
					s.push(calc);
				}
				else
				{
					calc = s.top();
					s.pop();
					printf("%c", calc.op);
				}

			}
		}
		while (!s.empty())
		{
			calc = s.top();
			s.pop();
			printf("%c", calc.op);
		}
		printf("\n");
	}
}

时间: 2024-11-02 01:41:15

逆波兰式与表达式求解的相关文章

使用逆波兰式进行表达式求值

中缀表达式及后缀表达式图解中说明了使用逆波兰式进行表达式求值的方法,这里使用C++进行实现.实现和原理讲解有一点不同,需要进一步进行细化. 关于将中缀表达式转换成后后缀表达式的规则: 规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分:若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止. 上面的规则转换成下面的执行规则: 1.遇到操作数:直接输出(添加到后缀

js实现 - 逆波兰式

没有任何方法,除非你才华横溢. --艾略特 js实现 - 逆波兰式 2019-05-26 by 文科生 最近编译原理实验有涉及到逆波兰式,而且听闻有人在前端面试过程中被问到逆波兰式算法的实现,之前的离散数学课程中也有涉及到逆波兰式,作为一名前端人员,终于按耐不住想用js去实现求逆波兰式的算法.我查阅了大量的资料,发现有的算法虽然基本实现了对应的功能,但在细节处理方面略显不妥:而有的算法写的过于庞杂,想要完全读懂则代价昂贵,而且代码的臃肿不是因为算法本身复杂,而是加入了一些算符,这对理解算法本质是

算法题---带加减乘除和括号的单字母变量表达式转化成逆波兰式

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define STACK_INIT_SIZE 100 #define STACK_INCREAMENT 10 #pragma warning(disable:4996)//我用的vs2015,不加这句用scanf会报错(使用了unsafe的函数) typedef struct { //栈 char *base; char *top; int stack

栈应用——逆波兰式表达式的值

问题描述: 计算给定的逆波兰表达式(即后缀表达式)的值. 事实上,二元运算的前提下,中缀表达式可以对应一棵二叉树:逆波兰式即该二叉树后序遍历的结果. 分析思路: 如果当前是操作数,则直接入栈: 如果当前是操作符,则栈顶的两个元素弹出,然后与当前操作符运算后入栈. Code: /** * 给出一个逆波兰式,计算该表达式的值 * @param s * @return */ public int getTheValueOfRPN(String s) { char[] ch = s.toCharArra

逆波兰式篇(后缀表达式)

一.逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面.也称为后缀表达式. 二.一般算法 将一个普通的中序表达式转换为逆波兰表达式的一般算法是: 首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则. 读入一个中缀表达式,为了方便起见,可在其最右端追加一个最低优先级运算符(如:#号).(这样做的目的是,最后读入#号运算符时将运算符栈中所有运算符都输       出). 从左至右扫描该中

从中序表达式到逆序表达式(逆波兰式)(四则运算表达式求值)

本份代码需要两个栈.一个是符号栈,一个是数字栈. 输入中序表达式如9+(3-1)*3+10/2# #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> #define max 100 char ex[max]; /*存储后序表达式*/ /*函数功能:将中序表达式转化为后序表达式*/ void trans() { char str[max]; /*表达式字符串*/ char stack[max]; /*运

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

输入 :后缀表达式(可带浮点数) 输出:double型的计算结果 代码: #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define ElemType double #define Stack_Init_Size 100 #define Increase_Size 10 #define MaxBuffer 10 typedef struct sqStack { ElemType *top; Ele

逆波兰式

在程序设计中,可能碰到需要对字符串数学表达式求值的问题,常用的方法是解析表达式,生成二叉树,然后进行计算.编译器就是使用这种方法来解析程序中的表达式的.这种方法实现起来有点难度,需要考虑运算符的优先级,括号的配对,堆栈的使用等等.我们正常情况下看到的数学表达式如果用二叉树遍历的话,恰好是中序遍历,故叫做中序表达式.除此之外,还有前序表达式,后序表达式.如:a+b+c(中序),++abc(前序),ab+c+(后序),如果表达式含有×,/,()等就更复杂了. 后缀表达式也称逆波兰表达式 因其使表达式

python 逆波兰式

逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部 class Stack(object): '''堆栈''' def __init__(self): self._stack = [] def pop(self): return self._stack.pop() def push(self, x): self._stack.append(x) 一.表达式无括号 def solve(bds): '''不带括号,引入#运算符''' pro = dict(