• [栈/STL] 简易计算器


    最近刚刚自学了一点点数据结构和STL,刚好写个简易的计算器    O(∩_∩)O

    首先了解了一下逆波兰表达式

    《大话数据结构》一书中阐释得较为易懂

     

     

     

     

     

      1 #include<iostream>
      2 #include<ctype.h>//isdigit()
      3 #include <cstring>
      4 #include<stack>
      5 using namespace std;
      6 
      7 stack<char> opCh;
      8 stack<long long> opNum;
      9 inline long long Calculate()
     10 {
     11     long long b = opNum.top();
     12     opNum.pop();
     13     long long a = opNum.top();
     14     opNum.pop();
     15     char operate = opCh.top();
     16     opCh.pop();
     17 
     18     switch (operate) 
     19     {
     20         case '+':
     21             return a + b;
     22         case '-':
     23             return a - b;
     24         case '*':
     25             return a * b;
     26         case '/':
     27             return a / b;
     28     }
     29 }
     30 inline long long Ojrank(char ch)
     31 {
     32     switch (ch) 
     33     {
     34         case '(':
     35             return 0;
     36         case '+':
     37         case '-':
     38             return 1;
     39         case '*':
     40         case '/':
     41             return 2;
     42         case ')':
     43             return 3;
     44     }
     45 }
     46 int main()
     47 {
     48     cout << "计算器1.0[仅支持整数的简单运算]" << endl;
     49     cout << "请输入计算表达式:" << endl;
     50     string expression;
     51     cin >> expression;
     52     int len = expression.length();
     53 
     54     long long topChRank, currentChRank;
     55     long long i = 0;
     56     long long number;
     57     while (expression[i] != '=' && expression[i] != '')
     58     {
     59         if (isdigit(expression[i]))//数字
     60         {
     61             number = 0;
     62             while (expression[i] != '=' && expression[i] != '' && isdigit(expression[i]))
     63             {
     64                 number = number * 10 + (expression[i]-'0');
     65                 i++;
     66             }
     67             opNum.push(number);
     68         }
     69         else//字符
     70         {
     71             if (opCh.empty()) {//字符栈为空
     72                 opCh.push(expression[i]);
     73                 i++;
     74                 continue;
     75             }
     76             topChRank = Ojrank(opCh.top());//获取优先级
     77             currentChRank = Ojrank(expression[i]);
     78             if (currentChRank == 0) {//左括号
     79                 opCh.push(expression[i]);
     80                 i++;
     81             }
     82             else if (currentChRank == 3) {//右括号
     83                 while (opCh.top() != '(') {
     84                     number = Calculate();
     85                     opNum.push(number);
     86                 }
     87                 opCh.pop();//弹出左括号
     88                 i++;
     89             }
     90             else {
     91                 while (!opCh.empty() && currentChRank <= topChRank)//优先级低的不能压在高的上面
     92                 {
     93                     number = Calculate();
     94                     opNum.push(number);;
     95                     topChRank = Ojrank(expression[i]);//即时更新栈顶字符优先级
     96                 }
     97                 opCh.push(expression[i]);
     98                 i++;
     99             }
    100         }
    101     }
    102 
    103     while (!opCh.empty())
    104     {
    105         number = Calculate();
    106         opNum.push(number);
    107     }
    108     if(expression[len-1] == '=')
    109         cout << expression << number << endl;
    110     else
    111         cout << expression <<'='<< number << endl;
    112     return 0;
    113 }
    天涯犹在,不诉薄凉。
  • 相关阅读:
    (转)磁盘管理(一,二)
    (转)认识 Linux 文件系统
    (转)linux磁盘分区fdisk分区和parted分区
    (转)centos7.4 fdisk磁盘分区 格式化 挂载
    (转)磁盘分区类型选择与磁盘分区配置过程
    (转)linux配置网卡的命令
    (转)磁盘阵列RAID原理、种类及性能优缺点对比
    (转)AIX 中 Paging Space 使用率过高的分析与解决
    (转)Linux内核参数设置sysctl命令详解
    (转)linux mount (挂载命令)详解
  • 原文地址:https://www.cnblogs.com/Knight02/p/14599587.html
Copyright © 2020-2023  润新知