11234 - Expressions

题目:11234 - Expressions


题目大意:就是将后缀表达式转换成层次遍历的逆向输出。


解题思路:

1,将后缀表达式利用栈建树,当遇到是小写字母时,建立叶子节点,遇到大写字母时,从栈中在弹出两个数,建立以大写字母为根的树。再将这个根节点放到栈中。

2,树建完后,就利用队列,进行层次遍历,最后在逆序输出。

#include<stdio.h>
#include<string.h>
#include<stack>
#include<queue>
using namespace std;

int n;
const int N = 10005;
char s[N];

struct treeNode {

	char name;
	treeNode * left;
	treeNode * right;
	treeNode(char ch):name(ch), left(NULL), right(NULL){}

} * first = NULL;
stack<treeNode *> st;
queue<treeNode *> q;
void buildtree (treeNode * t, treeNode * t1, treeNode *t2) {

	t->left = t1;
	t->right = t2;
}

void levelsearch() {

	treeNode * p = first;
	memset(s, 0, sizeof(s));
	int k = 0;
	q.push(p);
	while(!q.empty()) {

		s[k++] = q.front() ->name;
		p = q.front();
		q.pop();
		if(p->left != NULL)
		q.push(p->left);
		if(p ->right != NULL)
		q.push(p ->right);
	}
	s[k] = '\0';
}
int main() {
	
	scanf("%d", &n);
	while(n--) {

		scanf("%s", &s);
		int len = strlen(s), i;
		for(i = 0; i < len; i++) {
		
			treeNode *p = new treeNode(s[i]);
			if(i == len - 1)
				first = p;
			if(s[i] >= 'a' && s[i] <= 'z')
				st.push(p);
			else  {

				treeNode  *p1, *p2;
				p1 = st.top ();
				st.pop();
				p2 = st.top();
				st.pop();
				buildtree(p, p2, p1);
				st.push(p);
			}

		}
		while(!st.empty())
			st.pop();
		levelsearch();
		len  = strlen(s);
		for(i = len - 1; i >= 0 ; i--)
			printf("%c",s[i]);
		printf("\n");
	
	}
	return 0;
}


你可能感兴趣的:(11234 - Expressions)