南阳OJ 中缀式变后缀式



/*中缀式变后缀式

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,

关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,

这里不再赘述,现在你的任务是将中缀式变为后缀式。

输入第一行输入一个整数n,共有n组测试数据(n<10)。

每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,

每个运算式都是以“=”结束。这个表达式里只包含+-/*与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。

数据保证除数不会为0输出每组都输出该组中缀式相应的后缀式,

要求相邻的操作数操作符用空格隔开。样例输入2

1.000+2/4=

((1+2)*5+1)/4=

样例输出1.000 2 4 / + =

1 2 + 5 * 1 + 4 / =

*/

/*题解:需要两个栈,一个是符号sta栈,一个是后缀式out栈,每次在buf中读取字符时,

如果是数字或者‘.’,则直接存到out栈里,如果是别的字符,则将它放入sta栈,

前提是保证sta栈内优先级严格递减。*/

<span style="font-size:18px;">#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define maxn 1010
char buf[maxn], out[maxn << 1];二进制的基础上左移
char sta[maxn]; // 符号栈
int id, id2;
int getLevel(char ch) {
    switch(ch) {
        case '(': return 0;
        case '+':
        case '-': return 1;
        case '*':
        case '/': return 2;
    }
}
  void check(char ch) {
    int level;
    if(ch == '(') sta[id2++] = ch;
    else if(ch == ')') {
        while(sta[id2-1] != '(') {
            out[id++] = sta[--id2];
            out[id++] = ' ';
        }
        --id2;
    } else {
        while(id2 && getLevel(sta[id2-1]) >= getLevel(ch)) {
            out[id++] = sta[--id2]; out[id++] = ' ';
        }
        sta[id2++] = ch;
    }
}  

void solve() {
    int i, sign; id = id2 = 0;
    for(i = sign = 0; buf[i] != '='; ++i) {
       if(isdigit(buf[i]) || buf[i] == '.') {
     out[id++] = buf[i]; sign = 1;
        } else {
            if(sign) {
                out[id++] = ' ';
                sign = 0;
            }
            check(buf[i]);
        }
    }
    while(id2) {
        if(sign) {
            out[id++] = ' ';
            sign = 0;
        }
        out[id++] = sta[--id2];
        out[id++] = ' ';
    }
    out[id] = '\0';
    printf("%s=\n", out);
}  

int main() {
    // freopen("stdin.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    while(t--) {
        scanf("%s", buf);
        solve();
    }      return 0;
}  </span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 15:43:19

南阳OJ 中缀式变后缀式的相关文章

NYOJ467中缀式变后缀式

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

NYOJ467 中缀式变后缀式 【栈】

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

中缀式变后缀式

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个

NYOJ 467 中缀式变后缀式

做了表达式求值那道题之后做的 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"=&quo

南阳 oj 中缀式变后缀式 题目467 数据结构 NYOj

 #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 1000 using namespace std; char s[N];//存储字符串 char str1[N];//存储'o'-到'9'的字符 char str2[N];//存储运算符 int top1,top2;//利用数组模拟栈 int compare(char x)//优先级比较 { switch(x) { case '+'

栈的应用 — 中缀式转后缀式

由中缀式转换成后缀式,同样使用栈,并运用一些规则来完成.规则介绍如下: 当读到的是操作数,立即输出. 当读到的是运算符,则先从栈中弹出优先级高于自己的运算符(不包含括号),自己入栈. 读到左括号入栈,读到右括号则将栈中元素出栈并输出,直到遇见左括号(括号都不输出). 输入为空后,将栈元素弹出并输出直到栈空. 注意,最后生成的后缀表达式是考虑了运算符优先级的,再配合逆波兰的无优先级概念这一性质,就能够编写出一个带运算符优先级和括号的简易计算器了. 下面是完整的计算器代码,整型四则运算,可加括号.写

[Code] 中缀式转后缀式

[Code] 中缀式转后缀式 概要 对于一个可带括号的中缀四则运算表达式, 例如30 + 4 / 2 或 30 / ( 4 + 2 ), 下面代码将分别转换为对应的后缀表达形式 30 4 2 / + 和 30 4 2 + /. 要求每个 token 之间以若干个空白符隔开, 输入的中缀式为单行. 代码 import java.util.Scanner; import java.util.Deque; import java.util.ArrayDeque; import java.util.Ma

恶补C++ 之 自增、自减操作符前缀式与后缀式的区别

相信很多人刚开始学习编程的时候,也是为这个问题烦恼过吧,前缀式与后缀式,在很久之前,式没有办法区别++和--操作符的前缀和后缀的调用的.不过在C++已经得到了扩展. 然而无论式前缀或者后缀,都只有一个参数.为了解决这个问题,C++规定后缀形式有一个int类型的参数,当函数被调用的时候,编译器传递一个0作为int参数给该函数: class UPInt { public: UPInt& operator++();        // ++前缀 const UPInt operator++(int);

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

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