找回密码
 立即注册
首页 业界区 安全 表达式求值

表达式求值

秦晓曼 2025-6-1 00:02:17
github仓库:https://github.com/EanoJiang/Data-structures-and-algorithms
栈——表达式求值

1.png

枚举
  1. typedef enum{
  2.         枚举元素;
  3. }枚举名;
复制代码
后缀表达式运算逻辑

遇到数字入栈,遇到符号出栈运算,运算结果入栈,\0结束
2.png

3.png

4.png
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. #define MAXSIZE 100
  5. typedef struct Stack{
  6.     int top;
  7.     ElemType *data;
  8. }Stack;
  9. // 初始化栈
  10. Stack* initStack(){
  11.     Stack *s = (Stack*)malloc(sizeof(Stack));
  12.     s->data = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
  13.     s->top = -1;
  14.     return s;
  15. }
  16. int isEmpty(Stack* s){
  17.     return s->top == -1;
  18. }
  19. //入栈
  20. int push(Stack *s, ElemType e){
  21.     if(s->top == MAXSIZE-1){
  22.         printf("栈满\n");
  23.         return 0;
  24.     }
  25.     s->top++;
  26.     //从栈顶入栈
  27.     s->data[s->top] = e;
  28.     return 1;
  29. }
  30. //出栈
  31. ElemType pop(Stack *s,ElemType *e){
  32.     if(s->top == -1){
  33.         printf("栈空\n");
  34.         return 0;
  35.     }
  36.     *e = s->data[s->top];
  37.     s->top--;
  38.     return *e;
  39. }
  40. //查看栈顶元素
  41. ElemType getTop(Stack *s,ElemType *e){
  42.     if(s->top == -1){
  43.         printf("栈空\n");
  44.         return 0;
  45.     }
  46.     *e = s->data[s->top];
  47.     return *e;
  48. }
  49. typedef enum {
  50.     LEFT_PARE,RIGHT_PARE,
  51.     ADD,SUB,MUL,DIV,MOD,
  52.     EOS,NUM
  53. }contentType;
  54. char expr[] = "82/2+56*-";
  55. contentType getToken(char *symbol,int *index){
  56.     //存储当前字符
  57.     *symbol = expr[*index];
  58.     //这句不能写成*index++:指针*index的地址自增
  59.     *index = *index + 1;//指针*index的值自增
  60.     switch(*symbol){
  61.         case '(':
  62.             return LEFT_PARE;
  63.         case ')':
  64.             return RIGHT_PARE;
  65.         case '+':
  66.             return ADD;
  67.         case '-':
  68.             return SUB;
  69.         case '*':
  70.             return MUL;
  71.         case '/':
  72.             return DIV;
  73.         case '%':
  74.             return MOD;
  75.         case '\0':
  76.             return EOS;
  77.         default:
  78.             if(*symbol >= '0' && *symbol <= '9'){
  79.                 return NUM;
  80.             }
  81.             else{
  82.                 printf("非法字符\n");
  83.                 return -1;
  84.             }
  85.     }
  86. }
  87. //计算后缀表达式
  88. int eval(Stack *s){
  89.     char symbol;
  90.     int op1,op2;
  91.     int index = 0;
  92.     ElemType result;
  93.     contentType token;
  94.     token = getToken(&symbol,&index);
  95.     //结束条件\0
  96.     while(token!= EOS){
  97.         //遇到数字
  98.         if(token == NUM){
  99.             //将数字(字符相应ASCII码-'0')压入栈中
  100.             push(s,symbol - '0');
  101.         }
  102.         //遇到操作符
  103.         else{
  104.             //出栈,把被操作数存到op2和op1中
  105.             pop(s,&op2);
  106.             pop(s,&op1);
  107.             //计算结果入栈
  108.             switch(token){
  109.                 case ADD:
  110.                     push(s,op1 + op2);
  111.                     break;
  112.                 case SUB:
  113.                     push(s,op1 - op2);
  114.                     break;
  115.                 case MUL:
  116.                     push(s,op1 * op2);  
  117.                     break;
  118.                 case DIV:
  119.                     push(s,op1 / op2);
  120.                     break;
  121.                 case MOD:
  122.                     push(s,op1 % op2);
  123.                     break;
  124.                 default:
  125.                     printf("非法字符\n");
  126.                     return 0;
  127.             }
  128.         }
  129.         //更新token
  130.         token = getToken(&symbol,&index);
  131.     }
  132.     //循环结束条件\0后,栈中只有一个元素,出栈并打印
  133.     pop(s,&result);
  134.     printf("结果为:%d\n",result);
  135.     return 1;
  136. }
  137. int main(){
  138.     Stack *s = initStack();
  139.     eval(s);
  140.     return 0;
  141. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册