zoukankan      html  css  js  c++  java
  • 【数据结构】用栈解决表达式求值问题

    题目:求4+4/2-9*3的值;

    思路:

      ①:用一个字符型数组存放了表达式《4+4/2-9*3》;

    1 char val[9] = {'4','+','4','/','2','-','9','*','3'};

      ②:定义两个栈,一个存放数字,一个存放符号;

     1 //定义存储整型的栈
     2 typedef struct node
     3 {
     4     int data[MAXSIZE];
     5     int top;
     6 }SeqStack;
     7 //定义存储字符型的栈
     8 typedef struct nodeb
     9 {
    10     char data[MAXSIZE];
    11     int top;
    12 }SeqStackchar;

      ③:定义符号的优先级;

     1 //获取优先级
     2 int youxianquan(char c)
     3 {
     4     int x;
     5     switch(c)
     6     {
     7         case '-':
     8         case '+':
     9             x = 1;
    10             break;
    11         case '*':
    12         case '/':
    13             x = 2;
    14             break;
    15         default: printf("error");
    16     }
    17     return(x);
    18 }

      ④:确定运算思路——自左扫描表达式的每一个字符时,若当前字符是运算数值,入整型栈。是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低,则从对象栈出栈两个运算量,从运算符栈出栈一个运算符进行运算,将其运算结果入对象栈。然后继续判断当前字符串是否高于栈顶运算符,如果比栈顶运算符高,则入栈,否则则继续运算。

     1 //表达式求值
     2 int result(SeqStack *a, SeqStackchar *b)
     3 {
     4     char val[9] = {'4','+','4','/','2','-','9','*','3'};        //创建表达式
     5     int i,resultval;
     6     int x,y;
     7     char c;
     8     int n = sizeof(val);
     9     for(i = 0; i < n; i++)
    10     {
    11         c = val[i];        //获取表达式第i个值
    12         if(i%2 == 0)    //把数字和符号区分开来,
    13         {
    14             a->top++;
    15             a->data[a->top] = c - '0';    //存放数值的
    16         }
    17         else        //存放符号的
    18         {
    19             if(b->top == -1)        //如果b为空则直接存入符号
    20             {
    21                 b->top++;
    22                 b->data[b->top] = c;
    23             }
    24             else
    25             {
    26                 x = youxianquan(c);                //求出当前符号的优先级
    27                 y = youxianquan(b->data[b->top]);    //求b栈顶的符号优先级
    28                 if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
    29                 {
    30                     b->top++;
    31                     b->data[b->top] = c;
    32                 }
    33                 else        
    34                 {
    35                     resultval = abyunsuan(a,b);        //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a;
    36                     y = youxianquan(b->data[b->top]);        //继续判断表达式第i个值的优先级是否大于栈顶符号的优先级
    37                     if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
    38                     {
    39                         b->top++;
    40                         b->data[b->top] = c;
    41                     }
    42                     else        //否则重复上面的操作对a的前两个出栈值和b的栈顶出栈并且运算
    43                     {
    44                         resultval = abyunsuan(a,b);
    45                         //由于每次循环都会对b的栈顶符号的优先级做对比,所以优先级的对比只做一次即可
    46                         b->top++;            //把当前的符号进b栈
    47                         b->data[b->top] = c;
    48                     }
    49                 }
    50             }
    51         }
    52         while(i == n - 1 && a->top != -1 && b->top != -1)        //当运算符输入完时
    53         {
    54             resultval = abyunsuan(a,b);
    55         }
    56     }
    57     return resultval;    
    58 }
     1 //a出栈两个值 b出栈栈顶运算符,进行运算
     2 int abyunsuan(SeqStack *a, SeqStackchar *b)
     3 {
     4     int fir,sec,resultval;
     5     char topchar;
     6     fir = a->data[a->top];
     7     a->top--;
     8     sec = a->data[a->top];
     9     a->top--;
    10     topchar = b->data[b->top];    //b的栈顶出栈
    11     b->top--;
    12     resultval = yunsuan(sec,fir,topchar);
    13     a->top++;
    14     a->data[a->top] = resultval;
    15     return(resultval);
    16 }

    全部代码如下:

      1 #include<stdio.h>
      2 #include<stdlib.h>
      3 #include<string.h>
      4 
      5 #define MAXSIZE 1024
      6 
      7 //定义存储整型的栈
      8 typedef struct node
      9 {
     10     int data[MAXSIZE];
     11     int top;
     12 }SeqStack;
     13 //定义存储字符型的栈
     14 typedef struct nodeb
     15 {
     16     char data[MAXSIZE];
     17     int top;
     18 }SeqStackchar;
     19 
     20 //创建整型栈
     21 SeqStack *creat_sa()
     22 {
     23     SeqStack *s;
     24     s = (SeqStack *)malloc(sizeof(SeqStack));
     25     s->top = -1;
     26     return(s);
     27 }
     28 //创建字符串栈
     29 SeqStackchar *creat_sb()
     30 {
     31     SeqStackchar *s;
     32     s = (SeqStackchar *)malloc(sizeof(SeqStackchar));
     33     s->top = -1;
     34     return(s);
     35 }
     36 
     37 //函数声明
     38 int youxianquan(char c);
     39 int yunsuan(int a, int b, char c);
     40 int result(SeqStack *a, SeqStackchar *b);
     41 int abyunsuan(SeqStack *a, SeqStackchar *b);
     42 
     43 //获取优先级
     44 int youxianquan(char c)
     45 {
     46     int x;
     47     switch(c)
     48     {
     49         case '-':
     50         case '+':
     51             x = 1;
     52             break;
     53         case '*':
     54         case '/':
     55             x = 2;
     56             break;
     57         default: printf("error");
     58     }
     59     return(x);
     60 }
     61 
     62 //开始运算
     63 int yunsuan(int a, int b, char c)
     64 {
     65     int result;
     66     switch(c)
     67     {
     68         case '*':
     69             result = a * b;
     70             break;
     71         case '/':
     72             result = a / b;
     73             break;
     74         case '+':
     75             result = a + b;
     76             break;
     77         case '-':
     78             result = a - b;
     79             break;
     80     }
     81     return(result);
     82 }
     83 
     84 //a出栈两个值 b出栈栈顶运算符,进行运算
     85 int abyunsuan(SeqStack *a, SeqStackchar *b)
     86 {
     87     int fir,sec,resultval;
     88     char topchar;
     89     fir = a->data[a->top];
     90     a->top--;
     91     sec = a->data[a->top];
     92     a->top--;
     93     topchar = b->data[b->top];    //b的栈顶出栈
     94     b->top--;
     95     resultval = yunsuan(sec,fir,topchar);
     96     a->top++;
     97     a->data[a->top] = resultval;
     98     return(resultval);
     99 }
    100 
    101 //表达式求值
    102 int result(SeqStack *a, SeqStackchar *b)
    103 {
    104     char val[9] = {'4','+','4','/','2','-','9','*','3'};        //创建表达式
    105     int i,resultval;
    106     int x,y;
    107     char c;
    108     int n = sizeof(val);
    109     for(i = 0; i < n; i++)
    110     {
    111         c = val[i];        //获取表达式第i个值
    112         if(i%2 == 0)    //把数字和符号区分开来,
    113         {
    114             a->top++;
    115             a->data[a->top] = c - '0';    //存放数值的
    116         }
    117         else        //存放符号的
    118         {
    119             if(b->top == -1)        //如果b为空则直接存入符号
    120             {
    121                 b->top++;
    122                 b->data[b->top] = c;
    123             }
    124             else
    125             {
    126                 x = youxianquan(c);                //求出当前符号的优先级
    127                 y = youxianquan(b->data[b->top]);    //求b栈顶的符号优先级
    128                 if(x > y)        //如果当前优先级大于栈顶优先级,则进栈
    129                 {
    130                     b->top++;
    131                     b->data[b->top] = c;
    132                 }
    133                 else        
    134                 {
    135                     resultval = abyunsuan(a,b);        //否则a的前两个出栈,b的栈顶出栈,然后进行运算,运算结果再进栈a;
    136                     b->top++;
    137                     b->data[b->top] = c;
    138                 }
    139             }
    140         }
    141         while(i == n - 1 && a->top != -1 && b->top != -1)        //当运算符输入完时 即当所有的字符全部输入完时才执行此循环
    142         {
    143             resultval = abyunsuan(a,b);
    144         }
    145     }

         //也可以把上面的一个while循环注释掉,然后加上下面的循环;
        /*
          while(a=>top != -1 && b->top != -1)
            resultval = abyunsuan(a,b);
        */
    146 return resultval; 147 } 148 149 void main() 150 { 151 SeqStack *a; 152 SeqStackchar *b; 153 int resultval; 154 a = creat_sa(); //创建链表a 155 b = creat_sb(); //创建链表b 156 resultval = result(a,b); 157 printf("%d",resultval); 158 159 }
  • 相关阅读:
    java-实现两种排序方法
    暑假,一遍一遍敲代码吧!
    java学习-如何定义一个函数及其简单练习
    关于函数重载的理解
    java学习中关于函数的练习
    在校大三学生,真心想学好计算机。可是,,,,没有目标,。。。。。。
    伪分布式网络爬虫框架的设计与自定义实现(一)
    网站架构成长路程之 箴言
    使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目
    使用visualStudio2017创建一个简单的控制台程序
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/2706457.html
Copyright © 2011-2022 走看看