• 数据结构专项训练-栈


    求前缀表达式的值 

    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

    输入格式:

    输入在一行内给出不超过30个字符的前缀表达式,只包含+-*/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

    输出格式:

    输出前缀表达式的运算结果,保留小数点后1位,或错误信息"ERROR"

     

    样例输入与输出:

    序号 输入 输出
    1
    + + 2 * 3 - 7 4 / 8 4
    
    13.0
    
    2
    / -25 + * - 2 3 4 / 8 4
    
    12.5
    
    3
    / 5 + * - 2 3 4 / 8 2
    
    ERROR
    
    4
    +10.23
    
    10.2

    这里就不按照惯例给出建议的测试用例了,直接用题目中给的4个就可以了。

    下面给出代码:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 #define MAXSIZE 30
      6 
      7 typedef double DateType;
      8 
      9 typedef struct
     10 {
     11     DateType date[MAXSIZE];
     12     int top;
     13 }Zhan, *PZ;
     14 
     15 void Push(PZ S, DateType n)
     16 {
     17     S->top++;
     18     S->date[S->top] = n;
     19 }
     20 
     21 DateType Pop(PZ S)
     22 {
     23     DateType m = S->date[S->top];
     24     S->top--;
     25     return m;
     26 }
     27 
     28 int main()
     29 {
     30     Zhan Z;
     31     PZ p = &Z;
     32     p->top = -1;
     33     char str[31];
     34     double num;
     35     gets(str);
     36     int i;
     37     int size = strlen(str);
     38     for (i = size - 1; i >= 0; i--)
     39     {
     40         if (str[i] >= '0'&&str[i] <= '9')
     41         {
     42             num = str[i] - '0';
     43             int k = 10;
     44             for (i = i - 1; i >= 0; i--)
     45             {
     46                 if ((str[i] >= '0'&&str[i] <= '9') || str[i] == '.')
     47                 {
     48                     if (str[i] >= '0'&&str[i] <= '9')
     49                     {
     50                         num = num + (str[i] - '0')*k;
     51                         k = k * 10;
     52                     }
     53                     else
     54                     {
     55                         num /= k;
     56                         k = 1;
     57                     }
     58                 }
     59                 else if (str[i] == '-')
     60                 {
     61                     num = -num;
     62                 }
     63                 else break;
     64             }
     65             Push(p, num);
     66         }
     67         else if (str[i] == ' ')
     68         {
     69             continue;
     70         }
     71         else
     72         {
     73             if (p->top >= 1)
     74             {
     75                 double a, b, s;
     76                 a = Pop(p);
     77                 b = Pop(p);
     78                 if (str[i] == '+')
     79                 {
     80                     s = a + b;
     81                 }
     82                 else if (str[i] == '-')
     83                 {
     84                     s = a - b;
     85                 }
     86                 else if (str[i] == '*')
     87                 {
     88                     s = a * b;
     89                 }
     90                 else
     91                 {
     92                     if (b == 0)
     93                     {
     94                         printf("ERROR
    ");
     95                         return 0;
     96                     }
     97                     else s = a / b;
     98                 }
     99                 Push(p, s);
    100             }
    101             else
    102             {
    103                 printf("ERROR
    ");
    104                 return 0;
    105             }
    106         }
    107     }
    108     if (p->top == 0) printf("%.1f
    ", p->date[p->top]);
    109     else printf("ERROR
    ");
    110     system("pause");
    111     return 0;
    112 }

    写的比较好的就是在一个for循环中再嵌套一个for循环,而且变量还是i

     
     







    Pop Sequence 

    Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

    Output Specification:

    For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

    Sample Input:

    5 7 5
    1 2 3 4 5 6 7
    3 2 1 7 5 6 4
    7 6 5 4 3 2 1
    5 6 4 3 7 2 1
    1 7 6 5 4 3 2

    Sample Output:

    YES
    NO
    NO
    YES
    NO

    说明:该题目就是要求1到N依次入栈,出栈随机,而得到与输入相同的队列,如果能得到,则输出YES,否则输出NO

    代码如下:
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #define MAXSIZE 1000
     4 
     5 typedef int DateType;
     6 typedef struct
     7 {
     8     DateType date[MAXSIZE];
     9     int top;
    10 }Zhan,*PZ; 
    11 
    12 void Push(PZ S,char n)//入栈
    13 {
    14     S->top++;
    15     S->date[S->top] = n;
    16 }
    17 
    18 void Pop(PZ S)//出栈
    19 {
    20     S->top--;
    21 }
    22 
    23
    24 int main()
    25 {
    26     int m,n,k,i;
    27     scanf("%d %d %d",&m, &n, &k); //m为栈的最大值,n为输出的队列长度,k为测试样例个数
    28     for (i = 0; i < k; i++)
    29     {
    30         Zhan Z; 
    31         PZ p = &Z;
    32         p->top = -1; //对栈定义及初始化
    33         int a[1000]; //用来存放每组样例
    34         int g;
    35         for (g = 0; g < n; g++)   //初始化每个样例
    36         {
    37             scanf("%d", &a[g]);
    38         }
    39         int t = 0, num = 1;  //t用来检索数组a当前的数据位置,num为依次入栈的自然数据
    40         while (t < n)                   
    41         {
    42             if (a[t] == num && p->top < m - 1) //如果当前自然数据等于当前检索的样例的a[t]值,且栈未满,即可通过入栈再出栈完成当前自然数字
    43             {
    44                 t++;
    45                 num++;
    46             }
    47             else if (p->top > -1 && p->top < m - 1 && a[t] == p->date[p->top]) //如果栈顶数字等于检索样例a[t]的值,则可出栈
    48             {
    49                 Pop(p);
    50                 t++;
    51             }
    52             else if (num != a[t] && p->top < m - 1) //如果当前自然数据不等于当前检索的a[t],且栈未满,则将该自然数据入栈
    53             {
    54                 Push(p, num);
    55                 num++;
    56             }
    57             else break; //若上述的情况均不成立,则说明该样例已经不是正确的,可以结束检索,退出循环
    58         }
    59         if (t < n) printf("NO
    ");//检索没进行完,循环中途退出,说明样例不正确
    60         else printf("YES
    ");
    61     }
    62     system("pause");
    63     return 0;
    64 }




  • 相关阅读:
    iOS AppStore个人开发者账号申请
    一个工程多个Target
    React Native环境搭建(iOS、Mac)
    vuex的简单使用
    在vue中使用sass
    一个javascript继承和使用的例子
    在vue中使用Element-UI
    CSS3 Flex布局和Grid布局
    (...)ES6三点扩展运算符
    h5 video切换到横屏全屏
  • 原文地址:https://www.cnblogs.com/jiamian/p/10308482.html
Copyright © 2020-2023  润新知