栈实现表达式求值

Posted NoviScl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈实现表达式求值相关的知识,希望对你有一定的参考价值。

本文简单的设计了一个针对一位整数的四则运算进行求值的算法,对于处理多位整数的四则运算,需要对本文接受输入的数据类型进行升级,把字符数组换成字符串数组,将一个整数的多位数字存入一个字符串进行处理。

代码如下:

  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 }

 

以上是关于栈实现表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

使用栈实现表达式求值

中缀表达式转后缀表达式(Java代码实现)

中缀表达式求值的思路分析与代码实现

中缀表达式求值的思路分析与代码实现

栈的应用——表达式求值

栈操作实现表达式求值