本文简单的设计了一个针对一位整数的四则运算进行求值的算法,对于处理多位整数的四则运算,需要对本文接受输入的数据类型进行升级,把字符数组换成字符串数组,将一个整数的多位数字存入一个字符串进行处理。
代码如下:
1 //用栈实现表达式求值(简化版) 2 #include<iostream> 3 #include<string> 4 #include<cassert> 5 using namespace std; 6 //栈的基本操作的实现 7 template<typename Type> class Stack { 8 private: 9 Type *elements; 10 int top_index,max_size; 11 public: 12 Stack(int length_input) { 13 elements=new Type[length_input]; 14 max_size=length_input; 15 top_index=-1; 16 } 17 ~Stack() { 18 delete[] elements; 19 } 20 bool push(Type element) { 21 if(top_index+1>=max_size){ 22 return false; 23 } 24 top_index++; 25 elements[top_index]=element; 26 return true; 27 } 28 bool pop() { 29 if(top_index<0){ 30 return false; 31 } 32 top_index--; 33 return true; 34 } 35 Type top() { 36 assert(top_index>=0); 37 return elements[top_index]; 38 } 39 bool empty() { 40 return top_index<0; 41 } 42 }; 43 //比较运算符的优先级 44 bool precede(char cur, char top) { 45 if((cur==‘*‘||cur==‘/‘)&&(top==‘+‘||top==‘-‘)){ 46 return true; 47 } 48 return false; 49 } 50 //对两个数和一个运算符进行计算 51 float operate(char opr, float a, float b) { 52 if(opr==‘+‘){ 53 return a+b; 54 } 55 else if(opr==‘-‘){ 56 return b-a; 57 } 58 else if(opr==‘*‘){ 59 return a*b; 60 } 61 else{ 62 return b/a; 63 } 64 } 65 //取当前栈顶两个数和栈顶运算符进行计算,并将结果压回存数的栈中 66 //注意这里传入的必须是栈的引用 67 void calc(Stack<float> &numbers, Stack<char> &operators) { 68 float a=numbers.top(); 69 numbers.pop(); 70 float b=numbers.top(); 71 numbers.pop(); 72 numbers.push(operate(operators.top(),a,b)); 73 operators.pop(); 74 } 75 int main() { 76 int n; 77 cin>>n; 78 Stack<float> numbers(n); 79 Stack<char> operators(n); 80 string buffer; 81 cin>>buffer; 82 int i=0; 83 while(i<n){ 84 //把数压入相应的栈 85 if(isdigit(buffer[i])){ 86 numbers.push(buffer[i]-‘0‘); 87 i++; 88 } 89 else{ 90 //如果当前运算符优先级大于栈顶运算符,压入栈顶 91 if(operators.empty()||precede(buffer[i],operators.top())){ 92 operators.push(buffer[i]); 93 i++; 94 } 95 //否则应先对当前栈顶的数进行计算 96 else{ 97 calc(numbers,operators); 98 } 99 } 100 } 101 while(!operators.empty()){ 102 calc(numbers,operators); 103 } 104 //最后存数的栈中存放的就是计算结果 105 cout<<numbers.top()<<endl; 106 return 0; 107 }
时间: 2024-10-13 22:42:28