UVA - 11234 Expressions

来源:互联网 发布:html是不是编程语言 编辑:程序博客网 时间:2024/06/07 15:27

2016-08-18

UVA - 11234 Expressions

题目大意:一个表达式,可以用栈来处理,同时可以用队列来处理。现在告诉你用栈处理的表达式顺序,求其用队列表示的顺序。几种操作数为小写字母,操作符为大写字母。

解题思路:采用栈来模拟,则为树的后序遍历,而用队列表示的是其层次遍历的逆序输出。所以根据后序遍历建树,再层次遍历该树,逆序输出。即遇到小写字母就建立一个只有根节点的树,并将该地址入栈。遇到大写字母,就建立一个根节点为该大写字母,然后从栈中取出两个地址,分别作为该节点的左右孩子,然后再将该根节点地址入栈。

注意:这题主要就是要懂得如何通过后序遍历求出二叉树。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct node {int l;int r;}node[10010];// -1 代表没有叶子节点,数字表示该根节点的叶子节点在字符串中的位置。int stack[10010];//用来存储所有的叶子节点,遇到根节点(大写字母)时将前两个叶子节点替代,根节点成为叶子节点。char str[10010];int main() {int N;scanf("%d", &N);while ( N-- ) {scanf("%s", str);int n = 0;int len = strlen(str);for (int i = 0; i < len; i++) {if ( str[i] >= 'a' && str[i] <= 'z' ) {stack[n++] = i;node[i].l = node[i].r = -1;}if ( str[i] >= 'A' && str[i] <= 'Z' ) {node[i].r = stack[--n];node[i].l = stack[--n];stack[n++] = i;}}stack[0] = len - 1;n = 1;for (int i = 0; n != len; i++) {if ( node[stack[i]].l != -1 )stack[n++] = node[stack[i]].l;if ( node[stack[i]].r != -1 )stack[n++] = node[stack[i]].r;}for (int i = len - 1; i >= 0; i--)cout << str[stack[i]];cout << endl;}return 0;}


0 0