表達式求值

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
string f(string s){
	vector<char> v;
	vector<char> vv;
	for(int i = 0; i < s.length(); i++){
		switch(s[i]){
			case '+':
			case '-':
				while(!v.empty() && v.back() != '('){
					char t = v.back();
					vv.push_back(t);
					v.pop_back();
				}
				v.push_back(s[i]);
				break;
			case '*':
			case '/':
				while(!v.empty() && (v.back() == '*' || v.back() == '/')){
					vv.push_back(v.back());
					v.pop_back();
				}
				v.push_back(s[i]);
				break;
			case '(':
				v.push_back('(');
				break;
			case ')':
				while(!v.empty() && v.back() != '('){
					vv.push_back(v.back());
					v.pop_back();
				}
				v.pop_back();
				break;
			default:
				while(isdigit(s[i])){
					vv.push_back(s[i]);
					i++;
				}
				i--;
				vv.push_back('#');
		}
		cout << i << " inserted" << endl;
	}
	while(!v.empty()){
		vv.push_back(v.back());
		v.pop_back();
	}
	s = "";
	for(int i = 0; i < vv.size(); i++){
		s += vv.at(i);
	}
	return s;
}
int f1(string s){
	vector<int> v;
	for(int i = 0; i < s.length(); i++){
		int a, b;
		switch(s[i]){
			case '-':
				b = v.back();
				v.pop_back();
				a = v.back();
				v.pop_back();
				v.push_back(a - b);
				break;	
			case '+':
				b = v.back();
				v.pop_back();
				a = v.back();
				v.pop_back();
				v.push_back(a + b);
				break;
			case '*':
				b = v.back();
				v.pop_back();
				a = v.back();
				v.pop_back();
				v.push_back(a * b);
				break;
			case '/':
				b = v.back();
				v.pop_back();
				a = v.back();
				v.pop_back();
				v.push_back(a / b);
				break;
			default:
				a = 0;
				while(isdigit(s[i])){
					a = a * 10 + s[i] - '0';
					i++;
				}
				v.push_back(a);
		}
	}
	return v.back();
}
int main(){
	string s = "(56-20)/(4+2)";
	cout << f(s) << endl;
	cout << f1(f(s));
}

過程中需要用到兩次棧,兩次都是從左到右進棧

中間結果用字符串接收。

操作符的位置會改變,但是操作數的位置不會改變。

發佈了17 篇原創文章 · 獲贊 3 · 訪問量 9245
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章