UVA - 11234 Expressions

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值