1. 程式人生 > >HDU1237 簡單計算器 【棧】+【逆波蘭式】

HDU1237 簡單計算器 【棧】+【逆波蘭式】

a + b gree rac 簡單計算器 data- 3.0 center 一個空格 har

簡單計算器

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 11955 Accepted Submission(s): 3896

Problem Description 讀入一個僅僅包括 +, -, *, / 的非負整數計算表達式,計算該表達式的值。

Input 測試輸入包括若幹測試用例。每一個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中僅僅有0時輸入結束。對應的結果不要輸出。

Output 對每一個測試用例輸出1行,即該表達式的值,精確到小數點後2位。



Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output
3.00
13.36

關鍵地方是在把中綴式轉換成後綴式時要保持符號棧從頂開始嚴格遞減,否則先出棧,再進棧。

#include <stdio.h>
#include <string.h>
char str[202], buf[202], sign[202]; //buf存儲逆波蘭式
double stack[202], a;
int len, n, id, id2, id3, id4;

double perform(double x, double y, char ch){
	if(ch == ‘*‘) return x * y;
	if(ch == ‘/‘) return x / y;
	if(ch == ‘+‘) return x + y;
	return x - y;
}

void check(char ch){
	buf[id2++] = ‘ ‘;
	if(ch == ‘*‘ || ch == ‘/‘){	
		while(id3 && (sign[id3-1] == ‘*‘ || sign[id3-1] == ‘/‘)) 
			buf[id2++] = sign[--id3];
		sign[id3++] = ch;
		return;
	}
	while(id3) buf[id2++] = sign[--id3];
	sign[id3++] = ch;
}

int main(){	
	while(gets(str)){
		len = strlen(str);
		if(len == 1 && str[0] == ‘0‘) break;
		id = id2 = id3 = id4 = 0;
		for(int i = 0; i < len; ++i){
			if(str[i] == ‘ ‘) continue;
			if(str[i] >= ‘0‘ && str[i] <= ‘9‘){
				buf[id2++] = str[i];
			}else check(str[i]);
		}
		while(id3) buf[id2++] = sign[--id3];
		//for(int i = 0; i < id2; ++i) putchar(buf[i]);
	 	for(int i = 0; i < id2; ++i){
			if(buf[i] == ‘ ‘) continue;
			if(buf[i] >= ‘0‘ && buf[i] <= ‘9‘){
				sscanf(buf + i, "%lf%n", &stack[id4++], &n);
				i += n - 1;
			}else stack[id4-2] = perform(stack[id4-2], stack[id4-1], buf[i]), --id4;			
		}
		
		printf("%.2lf\n", stack[0]);
	}
	return 0;
}

2014-11-3 21:55:30更新

#include <stdio.h>
#include <string.h>

#define maxn 1000

char buf[maxn], out[maxn], stack[maxn];
int id, id1, ida;
double A[maxn];

int level(char ch) {
	if(ch == ‘+‘ || ch == ‘-‘) return 1;
	return 2;
}

void check(char ch) {
	while(id1 && level(stack[id1-1]) >= level(ch)) {
		out[id++] = stack[--id1];
	}
	stack[id1++] = ch;
}

double cal(double a, double b, char ch) {
	if(ch == ‘-‘) return a - b;
	if(ch == ‘+‘) return a + b;
	if(ch == ‘*‘) return a * b;
	return a / b;
}

int main() {
	int i, n;
	bool sign;
	double a;
	while(gets(buf)) {
		if(strlen(buf) == 1 && buf[0] == ‘0‘)
			break;
		id = id1 = 0; sign = 0;
		for(i = 0; buf[i]; ++i) {
			if(buf[i] == ‘ ‘) continue;
			if(buf[i] >= ‘0‘ && buf[i] <= ‘9‘ || buf[i] == ‘.‘) {
				if(sign) {
					out[id++] = ‘ ‘;
					sign = 0;
				}
				out[id++] = buf[i];
			}
			else sign = 1, check(buf[i]);
		}

		while(id1) {
			out[id++] = stack[--id1];
		}

		for(i = ida = 0; i < id; ++i) {
			if(out[i] == ‘ ‘) continue;
			if(out[i] >= ‘0‘ && out[i] <= ‘9‘ || out[i] == ‘.‘) {
				sscanf(out + i, "%lf%n", &a, &n);
				A[ida++] = a; i += n - 1;
			} else A[ida-2] = cal(A[ida-2], A[ida-1], out[i]), --ida;
		}

		printf("%.2lf\n", A[0]);
	}
	return 0;
}


HDU1237 簡單計算器 【棧】+【逆波蘭式】