鱼C论坛

 找回密码
 立即注册
查看: 2866|回复: 0

[学习笔记] 栈、队列:中缀表达式转后缀表达式

[复制链接]
发表于 2021-11-12 17:29:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原理:


备注:


代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXSIZE 100

  4. typedef char Elemtype;

  5. typedef struct
  6. {
  7.     Elemtype *base;
  8.     Elemtype *top;
  9.     int stacksize;

  10. }SqStack;


  11. void InitStack(SqStack **E);                         //初始化栈
  12. void PushStack(SqStack **E, Elemtype N);                //进栈
  13. Elemtype PopStack(SqStack *E);                        //出栈
  14. void DeleStack(SqStack **E);                            //释放被占用内存地址
  15. int NeedStack(SqStack *E);                         //把字符转换成数字
  16. void OvHappy(SqStack **E, Elemtype N);             //字符输出

  17. void OvHappy(SqStack **E, Elemtype N)               //字符输出
  18. {
  19.     Elemtype temp;
  20.      if((*E)->base == (*E)->top)
  21.     {
  22.         PushStack(&(*E), N);
  23.     }
  24.     else
  25.     {
  26.         while(1)
  27.         {
  28.             if((*E)->base == (*E)->top)
  29.             {
  30.                 PushStack(&(*E), N);
  31.                 return ;
  32.             }
  33.             else
  34.             {
  35.                 temp = PopStack(*E);
  36.             }


  37.             switch(N)
  38.             {
  39.                 case '+' :{

  40.                      if(temp == '+' || temp == '-' || temp == '*' || temp == '/')
  41.                     {
  42.                         printf("%c", temp);
  43.                     }
  44.                     else if(temp == '(')
  45.                     {
  46.                         PushStack(&(*E), temp);
  47.                         PushStack(&(*E), N);
  48.                         return;
  49.                     }
  50.                 }
  51.                 break;
  52.                 case '-' :{
  53.                       if(temp == '+' || temp == '-' || temp == '*' || temp == '/')
  54.                     {
  55.                         printf("%c", temp);
  56.                     }
  57.                     else if(temp == '(')
  58.                     {
  59.                         PushStack(&(*E), temp);
  60.                         PushStack(&(*E), N);
  61.                         return;
  62.                     }
  63.                 }
  64.                 break;
  65.                 case '*' :{
  66.                      if(temp == '*' || temp == '/' )
  67.                     {
  68.                         printf("%c", temp);
  69.                     }
  70.                     else  if(temp == '+' || temp == '-' )
  71.                     {
  72.                         PushStack(&(*E), temp);
  73.                         PushStack(&(*E), N);
  74.                         return;
  75.                     }
  76.                     else if(temp == '(')
  77.                     {
  78.                         PushStack(&(*E), temp);
  79.                         PushStack(&(*E), N);
  80.                         return;
  81.                     }
  82.                 }
  83.                 break;
  84.                 case '/' :{
  85.                      if(temp == '*' || temp == '/' )
  86.                     {
  87.                         printf("%c", temp);
  88.                     }
  89.                     else  if(temp == '+' || temp == '-' )
  90.                     {
  91.                         PushStack(&(*E), temp);
  92.                         PushStack(&(*E), N);
  93.                         return;
  94.                     }
  95.                     else if(temp == '(')
  96.                     {
  97.                         PushStack(&(*E), temp);
  98.                         PushStack(&(*E), N);
  99.                         return;
  100.                     }
  101.                 }
  102.                 break;
  103.                 case '(' :{
  104.                        PushStack(&(*E), temp);
  105.                        PushStack(&(*E), N);
  106.                        return;
  107.                 }
  108.                 break;
  109.                 case ')' :{
  110.                     while(temp != '(')
  111.                     {
  112.                         printf("%c", temp);
  113.                         temp = PopStack(*E);
  114.                     }
  115.                     return;
  116.                 }
  117.                 break;
  118.             }

  119.         }
  120.     }
  121. }

  122. int NeedStack(SqStack *E)                         //把字符转换成数字
  123. {
  124.     int a = 0, b = 0;
  125.     int i;
  126.     for(i = 1; E->top != E->base; i *= 10)
  127.     {
  128.         a = (int)PopStack(E) - '0';
  129.         b += a * i;
  130.     }
  131.     return b;
  132. }

  133. void DeleStack(SqStack **E)                            //释放被占用内存地址
  134. {
  135.     free((*E)->base);
  136.     free(*E);
  137. }

  138. Elemtype PopStack(SqStack *E)                         //出栈
  139. {
  140.     E->top--;
  141.     E->stacksize++;
  142.     return *(E->top);
  143. }
  144. void InitStack(SqStack **E)                    //初始化栈
  145. {
  146.     *E = (SqStack *)malloc(sizeof(Elemtype ));
  147.     if(!(*E))
  148.     {
  149.         printf("初始化*E内存分配错误\n");
  150.         exit(0);
  151.     }
  152.     (*E)->base = (Elemtype *)malloc(MAXSIZE * sizeof(Elemtype ));
  153.     if(!(*E)->base)
  154.     {
  155.         printf("初始化(*E)->base内存分配错误\n");
  156.         exit(0);
  157.     }
  158.     (*E)->top = (*E)->base;
  159.     (*E)->stacksize = MAXSIZE;
  160. }

  161. void PushStack(SqStack **E, Elemtype N)         //进栈
  162. {
  163.     if((*E)->top - (*E)->base >= (*E)->stacksize)       //检查栈是否不够了如果不够了就要增加栈的大小
  164.     {
  165.         (*E)->base = (Elemtype *)realloc((*E)->base, ((*E)->stacksize + MAXSIZE) * sizeof(Elemtype ));      //从新
  166.         if(!(*E)->base)
  167.         {
  168.             printf("扩容内存分配错误\n");
  169.             exit(0);
  170.         }
  171.         (*E)->top = (*E)->base + (*E)->stacksize;
  172.         (*E)->stacksize = (*E)->stacksize + MAXSIZE;
  173.     }
  174.     *((*E)->top) = N;
  175.     (*E)->top++;
  176.     (*E)->stacksize--;
  177. }

  178. int main()
  179. {
  180.     char C;
  181.     char N[100];
  182.     int i;
  183.     SqStack *L, *G;
  184.     InitStack(&L);          //数字转换栈
  185.     InitStack(&G);          //符号储存

  186.     for(i = 0; (C = getchar()) != '#'; i++)     //输入
  187.     {
  188.         N[i] = C;
  189.         N[i + 1] = '\0';
  190.     }


  191.     for(i = 0; N[i] != '\0'; i++)
  192.     {
  193.         if(N[i] >= '0' && N[i] <= '9')
  194.         {
  195.             while(N[i] >= '0' && N[i] <= '9')
  196.             {
  197.                 PushStack(&L, N[i]);
  198.                 i++;
  199.             }
  200.             printf("%d", NeedStack(L));
  201.         }

  202.         //从新建立一个函数

  203.         if(N[i] == '+'|| N[i] == '-' || N[i] == '*' || N[i] == '/' || N[i] == '(' || N[i] == ')')
  204.         {
  205.              OvHappy(&G, N[i]);
  206.         }
  207.         if(N[i+1] == '\0' && G->top != G->base)
  208.         {
  209.             printf("%c", PopStack(G));
  210.         }
  211.     }
  212.     //输出
  213.     return 0;
  214. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 15:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表