zoukankan      html  css  js  c++  java
  • 计算机考研机试指南(六) ——栈

    机试指南 cha 3 栈的应用

    括号匹配问题

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <stack>
     6 #include <math.h>
     7 #include <string>
     8 #include <string.h>
     9 #include <stdlib.h>
    10 #include <stack>
    11 using namespace std;
    12 
    13 /*
    14   问题:cha 3 栈的应用 括号匹配问题
    15   思路:如果直接在压栈的时候输出,则连续出现多个((((的$不能及时输出,
    16   必须要等到输入串遍历结束后,站内剩余(((才能将其对应输出串位置修改为$
    17 
    18   2 压栈的内容是字符还是字符在字符串中的索引位置?如果是字符则无法找到并修改ans中的字符
    19 */
    20 
    21 char ans[101];
    22 void match(char c[101])
    23 {
    24     stack<int> s;
    25     int i = 0;
    26     while (c[i] !='')
    27     {
    28         // 如果为)且为栈底则输出?,如果为(且为栈底则输出$,如果为其他字符则不压栈输出空格
    29         // 如果为左括号则压栈,右括号则判断栈顶,如果为(则弹栈
    30         if (c[i] == ')'&& s.empty())
    31             ans[i] = '?';
    32         else if (c[i] == '(')
    33           {
    34               s.push(i);
    35               ans[i] =  ' ';
    36           }
    37           else if (c[i] == ')' && c[s.top()] == '(')
    38           {
    39               s.pop();
    40               ans[i] = ' ';
    41           }
    42           else
    43             ans[i] =' ';
    44     i++;
    45     }
    46     while (!s.empty())
    47     {
    48         ans[s.top()] = '$';
    49         s.pop();
    50     }
    51     ans[i] = '';
    52 }
    53 int main()
    54 {
    55     char c[101];
    56     cin >> c;
    57     cout << c << endl;
    58     match(c); // 输出匹配的符号
    59     cout << ans << endl;
    60 
    61     return 0;
    62 }

    表达式求值(课本)

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <algorithm>
      4 #include <queue>
      5 #include <stack>
      6 #include <math.h>
      7 #include <string>
      8 #include <string.h>
      9 #include <stdlib.h>
     10 #include <stack>
     11 using namespace std;
     12 
     13 /*
     14 问题 : 简单计算器(表达式求值)
     15 
     16 */
     17 
     18 bool isNum(char c)
     19 {
     20     int num = c-'0';
     21     if (num >= 0 && num <= 9)
     22         return true;
     23     else
     24         return false;
     25 }
     26 
     27 char op[8][8] =
     28 {
     29     '0','+','-','*','/','(',')','#',
     30     '+','>','>','<','<','<','>','>',
     31     '-','>','>','<','<','<','>','>',
     32     '*','>','>','>','>','<','>','>',
     33     '/','>','>','>','>','<','>','>',
     34     '(','<','<','<','<','<','=','>',
     35     ')','>','>','>','>','0','>','>',
     36     '#','<','<','<','<','<','0','=',
     37 };
     38 char compare(char a,char b)
     39 {
     40     int x,y;
     41     for (int i = 1;i < 8;i++)
     42         if (op[i][0] == a)
     43         x = i;
     44     for (int i = 1;i < 8;i++)
     45         if (op[0][i] == b)
     46         y = i;
     47     return op[x][y];
     48 }
     49 int cal(int a,char op,int b)
     50 {
     51     switch (op)
     52     {
     53         case '+':return a+b;break;
     54         case '-':return b-a;break;
     55         case '*':return a*b;break;
     56         case '/':return b/a;
     57     }
     58 }
     59 int main()
     60 {
     61     char c[201];
     62     stack<char> oper;
     63     stack<int> number;
     64     oper.push('#');
     65     while (cin>>c)
     66     {
     67         if (c[0] =='0')
     68             break;
     69         int i = 0;
     70         while (c[i] != '#' || oper.top()!= '#')
     71         {
     72             if (isNum(c[i]))
     73             {
     74                 number.push(c[i]-'0');
     75                 i = i+1;
     76                 continue;
     77             }
     78             switch(compare(oper.top(),c[i]))
     79             {
     80             case '<':
     81                 // 继续压栈
     82                 oper.push(c[i]);
     83                 i = i+1;
     84                 break;
     85             case '=':
     86                 // 弹栈
     87                 oper.pop();
     88                 i = i+1;
     89                 break;
     90             case '>':
     91                 // 栈顶为优先级高的运算符,进行计算后压栈
     92                 char oper1 = oper.top();
     93                 oper.pop();
     94                 int num1 = number.top();
     95                 number.pop();
     96                 int num2 = number.top();
     97                 number.pop();
     98                 int ans = cal(num1,oper1,num2);
     99                 number.push(ans);
    100                 // 此时c[i]符号并没有压入栈中,所以不用i+2
    101 
    102             }
    103         }
    104         cout << number.top()<<endl;
    105     }
    106 
    107     return 0;
    108 }

    局限性:输入的表达式中数字不能是大于9的整数

    改进的表达式求值(计算大于9的整数)

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <algorithm>
      4 #include <queue>
      5 #include <stack>
      6 #include <math.h>
      7 #include <string>
      8 #include <string.h>
      9 #include <stdlib.h>
     10 #include <stack>
     11 using namespace std;
     12 
     13 /*
     14 问题 : 简单计算器(表达式求值)
     15 
     16 */
     17 
     18 bool isNum(char c[])
     19 {
     20     int num = c[0]-'0';
     21     if (num >= 0 && num <= 9)
     22         return true;
     23     else
     24         return false;
     25 }
     26 int Num(char c[])
     27 {
     28     // 计算数字的值
     29     int sum=0;
     30     int i=0;
     31     while (c[i]!='')
     32     {
     33         int a = c[i]-'0';
     34        // cout << c[i];
     35         sum = sum*10+a;
     36         i++;
     37     }
     38     return sum;
     39 }
     40 char op[8][8] =
     41 {
     42     '0','+','-','*','/','(',')','#',
     43     '+','>','>','<','<','<','>','>',
     44     '-','>','>','<','<','<','>','>',
     45     '*','>','>','>','>','<','>','>',
     46     '/','>','>','>','>','<','>','>',
     47     '(','<','<','<','<','<','=','>',
     48     ')','>','>','>','>','0','>','>',
     49     '#','<','<','<','<','<','0','=',
     50 };
     51 char compare(char a,char b)
     52 {
     53     int x,y;
     54     for (int i = 1;i < 8;i++)
     55         if (op[i][0] == a)
     56         x = i;
     57     for (int i = 1;i < 8;i++)
     58         if (op[0][i] == b)
     59         y = i;
     60     return op[x][y];
     61 }
     62 int cal(int a,char op,int b)
     63 {
     64     switch (op)
     65     {
     66         case '+':return a+b;break;
     67         case '-':return b-a;break;
     68         case '*':return a*b;break;
     69         case '/':return b/a;
     70     }
     71 }
     72 int main()
     73 {
     74     char c[10];
     75     stack<char> oper;
     76     stack<int> number;
     77     oper.push('#');
     78 
     79     while (cin>>c){// 每次仅输入一个单词,如果是运算符则c[0],数字则需要计算一下
     80     int i = 0;
     81     if (c[0] == '0')
     82         break;
     83     while (c[i] != '#' || oper.top()!= '#')
     84     {
     85         if (isNum(c))
     86         {
     87             number.push(Num(c));
     88            // cout << Num(c) << endl;
     89             cin >> c;
     90             continue;
     91         }
     92         switch(compare(oper.top(),c[i]))
     93         {
     94         case '<':
     95             // 继续压栈
     96             oper.push(c[i]);
     97             cin >> c;
     98             break;
     99         case '=':
    100             // 弹栈
    101             oper.pop();
    102             cin >> c;
    103             break;
    104         case '>':
    105             // 栈顶为优先级高的运算符,进行计算后压栈
    106             char oper1 = oper.top();
    107             oper.pop();
    108             int num1 = number.top();
    109             number.pop();
    110             int num2 = number.top();
    111             number.pop();
    112             int ans = cal(num1,oper1,num2);
    113             number.push(ans);
    114             // 此时c[i]符号并没有压入栈中,所以不用i+2
    115 
    116         }
    117     }
    118     cout << number.top()<<endl;
    119     }
    120 
    121     return 0;
    122 }

    测试用例:
    10 + 2 * 3 - 8 / ( 3 + 1 ) #
    0

    简单计算器 2006年浙江大学计算机及软件工程研究生机试真题

    这个题第一天重新写了一下课本上的实现方法,第二天改进成可以计算大于9的的算术表达式,第三天修改成符合这道机试题格式要求的题目。

    自己还差的很远。

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <algorithm>
      4 #include <queue>
      5 #include <stack>
      6 #include <math.h>
      7 #include <string>
      8 #include <string.h>
      9 #include <stdlib.h>
     10 #include <stack>
     11 using namespace std;
     12 
     13 /*
     14 问题 : 简单计算器(表达式求值)
     15 改进版3:输入串末尾没有#如何控制,用字符后面有没有空格来控制
     16 
     17 */
     18 
     19 bool isNum(char c[],int i)
     20 {
     21     int num = c[i]-'0';
     22     if (num >= 0 && num <= 9)
     23         return true;
     24     else
     25         return false;
     26 }
     27 int Num(char c[],int &i)
     28 {
     29     // 计算数字的值
     30     int sum=0;
     31     while (c[i]!=' ' && c[i]!='')
     32     {
     33         int a = c[i]-'0';
     34        // cout << c[i];
     35         sum = sum*10+a;
     36         i++;
     37     }
     38     return sum;
     39 }
     40 char op[8][8] =
     41 {
     42     '0','+','-','*','/','(',')','',
     43     '+','>','>','<','<','<','>','>',
     44     '-','>','>','<','<','<','>','>',
     45     '*','>','>','>','>','<','>','>',
     46     '/','>','>','>','>','<','>','>',
     47     '(','<','<','<','<','<','=','>',
     48     ')','>','>','>','>','0','>','>',
     49     '','<','<','<','<','<','0','=',
     50 };
     51 char compare(char a,char b)
     52 {
     53     int x,y;
     54     for (int i = 1;i < 8;i++)
     55         if (op[i][0] == a)
     56         x = i;
     57     for (int i = 1;i < 8;i++)
     58         if (op[0][i] == b)
     59         y = i;
     60     return op[x][y];
     61 }
     62 float cal(float a,char op,float b)
     63 {
     64     switch (op)
     65     {
     66         case '+':return a+b;break;
     67         case '-':return b-a;break;
     68         case '*':return a*b;break;
     69         case '/':return b/a;
     70     }
     71     return 0;
     72 }
     73 int main()
     74 {
     75     char c[50];
     76     stack<char> oper;
     77     stack<float> number;
     78     oper.push('');
     79 
     80     while (cin.getline(c,1000)){// 输入一行字符
     81     int i = 0;
     82     if (c[0] == '0')
     83         break;
     84     while (c[i] != '' || oper.top()!= '')
     85     {
     86         if (isNum(c,i))
     87         {
     88             float sum = Num(c,i);
     89             number.push(sum);
     90         //    cout << sum << endl;
     91             if (c[i]!='')
     92                 i++; // i自增前指向空格或者字符串终止符
     93             continue;
     94         }
     95         switch(compare(oper.top(),c[i]))
     96         {
     97         case '<':
     98             // 继续压栈
     99             oper.push(c[i]);
    100             i = i+1;
    101             if (c[i]!='') i++;
    102             break;
    103         case '=':
    104             // 弹栈
    105             oper.pop();
    106             i = i+1;
    107             if (c[i]!='') i++;
    108             break;
    109         case '>':
    110             // 栈顶为优先级高的运算符,进行计算后压栈
    111             char oper1 = oper.top();
    112             oper.pop();
    113             float num1 = number.top();
    114             number.pop();
    115             float num2 = number.top();
    116             number.pop();
    117             float ans = cal(num1,oper1,num2);
    118             number.push(ans);
    119             // 此时c[i]符号并没有压入栈中,所以不用i+2
    120 
    121         }
    122     }
    123     printf("%.2f
    ",number.top());
    124     }
    125 
    126     return 0;
    127 }
  • 相关阅读:
    Maven安装教程详解
    eclipse配置apache tomcat运行时访问路径不需要项目名称
    Spring MVC Captcha 验证码
    Vue混入的详解
    Eclipse上传项目到Git
    mysql 8.0.11 中使用 grant ... identified by 时 error 1064 near 'identified by '密码'' at line 1
    转 js自定义事件——Event和CustomEvent
    tp隐藏入口文件
    php发送邮件
    【项目练习】控制器直接操作--登录
  • 原文地址:https://www.cnblogs.com/twomeng/p/9509570.html
Copyright © 2011-2022 走看看