1. 程式人生 > >NYOJ467 中綴式變後綴式 【棧】

NYOJ467 中綴式變後綴式 【棧】

長度 rac level ... snippet std can gb2 track

中綴式變後綴式

時間限制: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 / =
來源
數據結構
上傳者

userid=mix_math" style="text-decoration:none; color:rgb(55,119,188)">mix_math

題意:...

題解:須要兩個棧,一個是符號sta棧。一個是後綴式out棧,每次在buf中讀取字符時。假設是數字或者‘.’,則直接存到out棧裏,假設是別的字符。則將它放入sta棧,前提是保證sta棧內優先級嚴格遞減。


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


NYOJ467 中綴式變後綴式 【棧】