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;
}