SPOJ Transform the Expression 逆波兰式算法题解

把带括号的一般正常的算式,转换成逆波兰式。

输入和输出如下例子:

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 ‘)’ 出栈到‘(’,然后出栈‘(’

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

4 操作符比较,高优先级的全部出栈,入结果,操作符入栈

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

int opToint(char op)
{
    if ('+' == op) return 0;
    if ('-' == op) return 1;
    if ('*' == op) return 2;
    if ('/' == op) return 3;
    if ('^' == op) return 4;
    return -1;
}  

bool cmpOP(char a, char b)
{
    return opToint(a) - opToint(b) < 0;
}  

string handleRPN(string &express)
{
    string ans;
    stack<char> stk;
    for (int i = 0; i < express.size(); i++)
    {
        if ('a' <= express[i] && express[i] <= 'z') ans.push_back(express[i]);
        else if ('(' == express[i]) stk.push(express[i]);
        else if (')' == express[i])
        {
            while (!stk.empty() && '(' != stk.top())
            {
                ans.push_back(stk.top());
                stk.pop();
            }
            if (!stk.empty() && '(' == stk.top()) stk.pop();
        }
        else
        {
            while (!stk.empty() && '(' != stk.top() &&
                !cmpOP(stk.top(), express[i]) )
            {
                ans.push_back(stk.top());
                stk.pop();
            }
            stk.push(express[i]);
        }
    }
    return ans;
}  

void TransformTheExpressionToRPN()
{
    string express;
    int T = 0;
    cin>>T;
    while (T--)
    {
        cin>>express;
        cout<<handleRPN(express)<<endl;
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, include
, return
, if
, express
, 操作符
逆波兰式
逆波兰式算法、逆波兰式算法 java、逆波兰式算法c、逆波兰式、编译原理逆波兰式,以便于您获取更多的相关知识。

时间: 2024-11-05 05:29:26

SPOJ Transform the Expression 逆波兰式算法题解的相关文章

PHP使用逆波兰式计算工资的方法_php技巧

本文实例讲述了PHP使用逆波兰式计算工资的方法.分享给大家供大家参考.具体如下: 将一个普通的中序表达式转换为逆波兰表达式的一般算法是: 首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰 式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束.可指定其他字符,不一定非#不可.从中缀式的左端 开始取字符,逐序进行如下步骤: (1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈:若取出的是运算符,并

C语言实现逆波兰式实例_C 语言

复制代码 代码如下: #include<stdio.h>#include<string.h> typedef struct{char s[20][20];int top;}SQ; void copystr(char *a,char *b){    int i=0;    do    {        b[i]=a[i];        i++;    }    while(a[i]!='\0');    b[i]='\0';} void voidSQ(SQ *s){    s-&g

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 =

逆波兰式与表达式求值

何为波兰式?何为逆波兰式? 如何与表达式求值联系起来? 波兰式.逆波兰式是数据结构和编译原理里面提到的知识点,我们平时的运算式都是这样的 2 + 3 * (5 - 1)-10(中缀表达式),这样表达式易于阅读和计算,但是对于计算机这样就有点懵逼了. 前缀表达式: 比如2 + 3 * (5 - 1)这个表达式的前缀表达式为+ 2 * 3 - 5 1来表示  波兰表达式 中缀序表达式:比如 2 + 3 * (5 - 1)-10 后缀表达式:比如2 + 3 * (5 - 1)用逆波兰式来表示则是:2

SPOJ 查找下一个回文Palindrome 算法题解

给出一个数值,well,其实不是数值了,而是一大串数字, 比如 98237482340328490328490324893024,非常长的数字. 找出下一个Palindrome,这个Palindrome在数值上要比当前数值大(不能等于). 如: 9 9 9 9->1 0 0 0 1 1 2 3 4 5 ->1 2 4 2 1 本算法时间效率是O(n),其中n是指数值的位数,不是数值,比如123456789,只有9位,那么本算法接近常数: 更多精彩内容:http://www.bianceng.c

算法题:逆波兰表达式(数学逆波兰表达式和交并集逆波兰表达式)

一.前言 在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示 法也称为中缀表示.每一运算符都置于其运算对象之后,称为后缀表达式,后缀表达式又叫做逆波兰表达式. 它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算.其运算方式如下:如果当前 字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表 达式扫描完后,栈里的就是结果. 二.一般算法 将一个普通的中序表达式转换为逆波兰表达式 的一般算法是: (1)首先构

python实现逆波兰计算表达式的方法

  这篇文章主要介绍了python实现逆波兰计算表达式的方法,较为详细的分析了逆波兰表达式的概念及实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法.按此方法,每一运算符都置于其运算对象之后,故称为后缀表示. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

printf-设有一个顺序表A,包含n个元素,要求写出一个将该表逆置的算法,

问题描述 设有一个顺序表A,包含n个元素,要求写出一个将该表逆置的算法, #include #define MaxLen 50 typedef int elemtype: typedef elemtype sqlist [MaxLen]: int create (sqlist A) { int i,n: printf("创建一个顺序表n"): printf("输入元素个数:"): scanf( ): for (i=0:i<n:i++) { printf(&qu

算法之【仿竖式算法】

另类四则运算之大整数加减法: 十进制的数值运算在计算机里都将转换成二进制的数值运算,而二进制的运算就是cpu中最根本的逻辑运算,最后再转化成十进制输出.这次介绍的方法是保留十进制的运算方式(小学生的列竖式计算),仅仅将每位数字转换成二进制.这种算法既在速度上有所提升,又能克服单个数据存储大小的限制.因此可以用来进行大整数的加减法(大整数通常指16位或32位以上整型数).至于竖式计算的原理就不说了哦,不然有损大家的智商!   核心:模拟竖式计算,将大整数的每一位分开来存储与计算.   C语言完整程