東華oj-進階題第92題-表達式求值

92 表達式求值

作者: 朱星垠 時間限制: 1S章節: 字符串

問題描述 :

以字符串形式輸入僅有整數和加減(正負)號構成的表達式,輸出該表達式的值。

輸入說明 :

標準輸入設備中有多組測試數據,每組輸入數據由一行組成,輸入僅有整數和加減(正負)號構成的表達式(但是表達式可以插入空格)。

輸出說明 :

依次輸出從標準輸入設備中讀入的每一組測試數據對應的結果,輸出一行,輸出該表達式的值。所有數據前後沒有多餘的空格,兩組數據之間也沒有多餘的空行。

輸入範例 :
3+ 4+ 5+6
0+1
輸出範例 :
18
1

代碼:

/*
	T92 表達式求值 
*/

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000 

int main() {
	int i = 0;
	int num = 0;// 表達式當中的數字 
	int res = 0;
	char op = '#';// 表達式當中的運算符 
	char exp[MAX_SIZE] = "";
	
	while (scanf("%d", &num) != EOF) {
		res = num;
		
		while (1) {
			while ((op = getchar()) == ' ');// 忽略空格
			if (op == '\n')
				break;
			
			scanf("%d", &num);
			if (op == '+')
				res += num;
			else 
				res -= num;
		}
		
		printf("%d\n", res);
	}
	
	return 0;
}

在這裏插入圖片描述
本地運行時沒問題的,可是oj上超時,查到原因是if (op == ‘\n’) break;這條語句在oj中沒有奏效,那麼在oj中一行的結束怎麼判斷呢?
害,試試其他方法:

/*
	T92 表達式求值 
	算法概述:按照讀運算符、讀數字、讀運算符、讀數字……這樣的順序處理,
	每處理一次按照運算符的正負計算一次 
*/

#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000 

int main() {
	int i = 0;
	int num = 0;// 表達式當中的數字 
	int res = 0;
	char preOp = '+';// 數字前的運算符 
	int count = 0;// 讀取到的除了空格外的字符的數量 
	char exp[MAX_SIZE] = "";// 表達式 
	
	while (gets(exp)) {
		count = 0, res = 0, i = 0; 
		
		while (i < strlen(exp)) {
			while (exp[i] == ' ')// 忽略空格
				i++;
				 
			count++;
			if (count == 1 && (exp[i] >= '0' && exp[i] <= '9')) {// 第一個字符特殊處理 
				preOp = '+';
				num = 0;
				while (exp[i] >= '0' && exp[i] <= '9') {// 合成數字 
					num = num * 10 + (exp[i] - '0');
					i++;
				}
				res = num;
				
				continue;
			}
			
			preOp = exp[i++];// 讀運算符 
				
			while (exp[i] == ' ')// 忽略空格
				i++;
				
			num = 0;
			while (exp[i] >= '0' && exp[i] <= '9') {// 合成數字 
				num = num * 10 + (exp[i] - '0');
				i++;
			}	
			
			if (preOp == '+') 
				res += num;
			else 
				res -= num;	 
		}
		printf("%d\n", res);
	}
	
	return 0;
}

AC了,不過這裏有兩個坑:

  1. 輸入字符串判斷EOF不能用gets(exp) != EOF,直接用gets(exp)就行
  2. scanf("%s", exp);這個碰到空格就算讀取完成了,如果需要讀取一行包括空格的,那麼需要改爲gets(exp)

ps:字符串事兒可真多……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章