zoukankan      html  css  js  c++  java
  • 运用栈实现表达式求值(+,-,*,/运算)

     1 #include <iostream>
     2 #include <string>
     3 #include <cassert>
     4 #include <iomanip>
     5 using namespace std;
     6 template<typename Type> class Stack {
     7 private:
     8     Type *elements;
     9     int max_size, top_index;
    10 public:
    11     Stack(int length_input) {
    12         elements = new Type[length_input];
    13         max_size = length_input;
    14         top_index = -1;
    15     }
    16     ~Stack() {
    17         delete[] elements;
    18     }
    19     bool push(const Type &element) {
    20         if (top_index >= max_size - 1) {
    21             return false;
    22         }
    23         top_index++;
    24         elements[top_index] = element;
    25         return true;
    26     }
    27     bool pop() {
    28         if (top_index < 0) {
    29             return false;
    30         }
    31         top_index--;
    32         return true;
    33     }
    34     Type top() {
    35         assert(top_index >= 0);
    36         return elements[top_index];
    37     }
    38     bool empty() {
    39         return top_index < 0;
    40     }
    41 };
    42 
    43 static char pre[128] = { 0 };
    44 
    45 void setpre()
    46 {
    47     pre['+'] = 1;
    48     pre['-'] = 1;
    49     pre['*'] = 2;
    50     pre['/'] = 2;
    51 }
    52 
    53 bool precede(char op1, char op2) {
    54     return pre[op1] > pre[op2] ? true : false;
    55 }
    56 double operate(char theta, double a, double b) {
    57     switch (theta) {
    58         case '-': return b - a; break;
    59         case '+': return a + b; break;
    60         case '*': return a * b; break;
    61         case '/': return (b * 1.0) / a; break;
    62     }
    63 }
    64 void calc(Stack<double> &numbers, Stack<char> &operators) {
    65     double a = numbers.top();
    66     numbers.pop();
    67     double b = numbers.top();
    68     numbers.pop();
    69     numbers.push(operate(operators.top(), a, b));
    70     operators.pop();
    71 }
    72 int main() {
    73     int n;
    74     setpre();
    75     cin >> n;
    76     Stack<double> numbers(n);
    77     Stack<char> operators(n);
    78     string buffer;
    79     cin >> buffer;
    80     int i = 0;
    81     while (i < n) {
    82         if (isdigit(buffer[i])) {
    83             numbers.push(buffer[i] - '0');
    84             i++;
    85         } else {
    86             if (operators.empty() || precede(buffer[i], operators.top())) {
    87                 operators.push(buffer[i]);
    88                 i++;
    89             } else {
    90                 calc(numbers, operators);
    91             }
    92         }
    93     }
    94     while (!operators.empty()) {
    95         calc(numbers, operators);
    96     }
    97     cout << fixed << setprecision(3) << numbers.top() << endl;
    98     return 0;
    99 }
  • 相关阅读:
    【Oracle11g】06_网络配置
    【Python3 爬虫】U20_正则表达式爬取古诗文网
    【Oracle11g】05_完整性约束
    【Python3 爬虫】U19_正则表达式之re模块其他函数
    【Python3 爬虫】U18_正则表达式之group分组
    【Python3 爬虫】U17_正则表达式之转义字符和原生字符
    【Python3 爬虫】U16_正则表达式之开始结束和或语法
    常见的概率分布
    广义线性模型
    gamma函数及相关其分布
  • 原文地址:https://www.cnblogs.com/ydqblogs/p/14257239.html
Copyright © 2011-2022 走看看