1. 程式人生 > >藍橋杯--演算法訓練 表示式計算

藍橋杯--演算法訓練 表示式計算

問題描述   輸入一個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。 輸入格式   輸入一行,包含一個表示式。 輸出格式   輸出這個表示式的值。 樣例輸入 1-2+3*(4-5) 樣例輸出 -4 資料規模和約定   表示式長度不超過100,表示式運算合法且運算過程都在int內進行。 atof函式講解: 標頭檔案:#include <stdlib.h>

函式 atof() 用於將字串轉換為雙精度浮點數(double),其原型為:
double atof (const char* str);

atof() 的名字來源於 ascii to floating point numbers 的縮寫,它會掃描引數str字串,跳過前面的空白字元(例如空格,tab縮排等,可以通過 isspace() 函式來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時('\0')才結束轉換,並將結果返回。引數str 字串可包含正負號、小數點或E(e)來表示指數部分,如123. 456 或123e-2。

【返回值】返回轉換後的浮點數;如果字串 str 不能被轉換為 double,那麼返回 0.0。
思路:根據符號的優先順序進行運算,本程式碼實現為定義兩個運算函式
include<cstdio>
#include<stack>
#include<string>
#include<cstring>
#include<cmath>
#include<ctype.h>

using namespace std;

stack <char> sCh; //用於存放符號的符號棧
stack <double> sNum;//用於存放資料的資料棧
char num[105];
char str1[105];

void cal_1()//接受加減乘除 
{
	double n1,n2;
	char ch;
	ch=sCh.top();
	while(ch!='('){
		n1=sNum.top();
		sNum.pop();
		n2=sNum.top();
		sNum.pop();
		switch(ch){
			case '+': 
				n2+=n1;
				break;
			case '-': 
				n2-=n1;
				break;
			case '*': 
				n2*=n1;
				break;
			case '/': 
				n2/=n1;
				break;
		}
		sNum.push(n2);//將新的結果入棧 
		sCh.pop();//刪除用過的符號 
		ch=sCh.top();
	}
}

void cal_2()
{
	double n1,n2;
	char ch;
	ch=sCh.top();
	while(ch =='*' || ch =='/'){
		n1=sNum.top();
		sNum.pop();
		n2=sNum.top();
		sNum.pop();
		if(ch == '*'){
			n2*=n1;
		}else if(ch == '/'){
			n2/=n1;
		}
		sNum.push(n2);
		sCh.pop();
		ch=sCh.top();
	}
	
}
int main()
{
	int k=0;
	double n;
	gets(str1);
	char c[2]="=";
	strcat(str1,c);
	sCh.push('(');//現將最低優先順序的左括號入棧 
	for(int i=0; str1[i]; ++i){
		if(str1[i]>='0' && str1[i]<='9' || str1[i]=='.'){
			num[k++]=str1[i];
			continue;
		}
		num[k]=0;//在尾部新增字母用於atof函式讀取數字 注意這裡的數字0存到數組裡是字母‘a’可以理解為結束標誌 
		if(num[0]!=0){
			n=atof(num);
			num[0]=0;
			sNum.push(n);
		}
		k=0; //下標歸零 
		switch(str1[i]){
			case '+' :
				cal_1();
				sCh.push('+');
				break;
			case '-' :
				cal_1();
				sCh.push('-');
				break;
			case '*' :
				cal_2();
				sCh.push('*');
				break;
			case '/' :
				cal_2();
				sCh.push('/');
				break;
			case '(' :
				sCh.push(str1[i]);
				break;
			case ')' :
				cal_1();
				sCh.pop();
				break;
			case '=' :
				cal_1();
				sCh.pop();
				break;
			
		}
	}
	printf("%.0lf",sNum.top());
	return 0;
}