codechef Transform the Expression 转换成逆波兰式

把一般式子转换成逆波兰式。

这里的都是加括号的,难度降低点。

Example

Input:
3
(a+(b*c))
((a+b)*(z+x))
((a+t)*((b+(a+c))^(c+d)))

Output:
abc*+
ab+zx+*
at+bac++cd+^*

知道其特点就好办:

1 遇到字母一定是可以输出的

2 遇到操作符号就入栈

3 遇到括号‘)‘,就出栈一个操作符 - 注意不是所有操作符出栈

不带括号的操作区别就在于是否需要判断符号的优先级。

#include <stack>
#include <stdio.h>
#include <iostream>
using namespace std;

int TransformTheExpression()
{
	int T = 0, c = 0, id = 0;
	scanf("%d\n", &T);
	char buffer[40200];
	char res[40200];
	stack<char> stk;
	if ((c = fread(buffer, 1, 40200, stdin)) > 0)
	{
		for (int i = 0; i < c; i++)
		{
			if (‘(‘ == buffer[i]) continue;

			if ( buffer[i] == ‘+‘ || buffer[i] == ‘-‘ ||
				buffer[i] == ‘*‘ || buffer[i] == ‘/‘ || buffer[i] == ‘^‘)
			{
				stk.push(buffer[i]);
			}
			else if (buffer[i] == ‘)‘)
			{
				res[id++] = stk.top();
				stk.pop();
			}
			else	res[id++] = buffer[i];
		}
	}
	fwrite(res, sizeof(char), id, stdout);
	return 0;
}

codechef Transform the Expression 转换成逆波兰式,布布扣,bubuko.com

时间: 2024-10-10 23:22:36

codechef Transform the Expression 转换成逆波兰式的相关文章

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

#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

逆波兰式

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

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

本份代码需要两个栈.一个是符号栈,一个是数字栈. 输入中序表达式如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]; /*运

栈的应用-逆波兰式

---恢复内容开始--- 普通的计算方式,也叫中缀表达式计算机识别及正确运用需要耗费大量的资源 23+45*2-(8+2) 计算机想要正确计算出此时的结果需要十分复杂,更何况情况十分多变. 逆波兰式:又叫做后缀表达式,它能去除中缀表达式的括号.十分符合计算机的计算思维,能极大提高效率 表达式不能用字符串进行存储,因为这将无法分辨,应用集合(ArrayList,LinkedList存储) 23 45 2 * 8 2 + - + 那么中缀表达式是如何变成后缀表达式的呢?原则如下: 1.首先把普通的表

算法题:四则运算(中缀式到后缀式的转换,值得思考的逆波兰式)

/* 字符串的四则运算.给出一个字符串, 包含0~9的数字和 + -*\/ ()的运算符, - 仅代表减号不代表负数.举例如下: 输入:1 + 2 * (3 - 4) */ //哈哈,看到这道题,其实一点也不难,这个题根本就不用思考, //当然是你明白算法之后,这里要用到的算法是逆波兰式. //如果你有不明白的地方,可以上网搜逆波兰式. /* 我的总结:计算机无法理解人类的正向思维,于是为了满足计算机的 思维,我们会反其道而行之,将操作符号放在操作数的后面,形成后缀 表达式,但是如果你能按百科上

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

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

【LeetCode-面试算法经典-Java实现】【151-Evaluate Reverse Polish Notation(计算逆波兰式)】

[151-Evaluate Reverse Polish Notation(计算逆波兰式)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another expression. Some

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

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

数据结构——逆波兰式

很久没有关注算法和数据结构,大部分知识都已经忘记了:是时间好好回炉一下了,说实话干读数据机构这本书还是挺枯燥而且这本书原理性比较多,有一定的难度.这不刚看到逆波兰式废了好大劲才搞懂,老了... 逆波兰式 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 一个表达式E的后缀形式可以如下定义: (1)如果E是一个变量或常量,则E的后缀式是E本身. (2)如果E是E1 op E2形式的表达式,这里op是如何二元操作符,则E的后缀