VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 671|回复: 0

[讨论] 数据结构表达式求值问题

[复制链接]
07_avatar_middle
在线会员 发表于 2016-10-14 17:05:59 | 显示全部楼层 |阅读模式
为什么结果不对呢?是不是程序有问题?
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>
  4. #define STACK_INIT_SIZE 20
  5. #define STACKINCREMENT 10
  6. #define ERROR 0
  7. #define OK 1
  8. typedef int ElemType;
  9. typedef struct
  10. {
  11.         ElemType *base;
  12.         ElemType *top;
  13.         int stacksize;
  14. }SqStack;

  15. int InitStack(SqStack *s)
  16. {
  17.         s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
  18.         if(!s->base)
  19.                 return ERROR;
  20.         s->top=s->base;
  21.         s->stacksize=STACK_INIT_SIZE;
  22.         return OK;
  23. }
  24. int Push(SqStack *s,char e)
  25. {
  26.         if(s->top-s->base>=s->stacksize)
  27.         {
  28.                 s->base=(ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
  29.                 if(!s->base)
  30.                         return ERROR;
  31.                 s->top=s->base+s->stacksize;
  32.                 s->stacksize+=STACKINCREMENT;
  33.         }
  34.         *(s->top)=e;
  35.         s->top++;
  36.         return OK;
  37. }
  38. int Pop(SqStack *s,char *e)
  39. {
  40.         if(s->top==s->base)
  41.         {
  42.                 return ERROR;
  43.         }
  44.         *e=*--(s->top);
  45.         return OK;
  46. }
  47. char GetTop(SqStack s)
  48. {
  49.         if(s.top==s.base)
  50.         {
  51.                 return ERROR;
  52.         }
  53.         else
  54.         {
  55.                 return (*(s.top-1));
  56.         }
  57. }
  58. int In(char c)//判断c是否为操作符
  59. {
  60.         switch(c)
  61.         {
  62.         case '+':
  63.         case '-':
  64.         case '*':
  65.         case '/':
  66.         case '(':
  67.         case ')':
  68.         case '#':
  69.                 return OK;
  70.                 break;
  71.         default:return ERROR;
  72.         }
  73. }
  74. char Priority(char t1,char t2)
  75. {
  76.         char f;
  77.         switch(t2)
  78.         {
  79.         case '+':
  80.         case '-':if(t1=='('||t1=='#')
  81.                                  f='<';
  82.                 else
  83.                         f='>';
  84.                 break;
  85.         case '*':
  86.         case '/':if(t1=='*'||t1=='/'||t1==')')
  87.                                  f='>';
  88.                 else
  89.                         f='<';
  90.                 break;
  91.         case '(':if(t1==')')
  92.                                  return ERROR;
  93.                 else
  94.                         f='<';
  95.                 break;
  96.         case ')':switch(t1)
  97.                          {
  98.         case '(':f='=';
  99.                 break;
  100.         case '#':return ERROR;break;
  101.         default:f='>';
  102.                          }
  103.         case '#':switch(t1)
  104.                          {
  105.         case '#':f='=';break;
  106.         case '(':return ERROR;break;
  107.         default:f='>';
  108.                          }
  109.         }
  110.         return f;
  111. }
  112. int operate(int a,char theta,int b)
  113. {
  114.         int c;
  115.         switch(theta)
  116.         {
  117.         case '+':
  118.                 c=a+b;
  119.                 break;
  120.         case '-':
  121.                 c=a-b;
  122.                 break;
  123.         case '*':
  124.                 c=a*b;
  125.                 break;
  126.         case '/':
  127.                 c=a/b;
  128.                 break;
  129.         }
  130.         return c;
  131. }
  132. char final()
  133. {
  134.         SqStack OPTR,OPND;
  135.         char c,x,a,b;
  136.         int i,j,e;
  137.         InitStack(&OPTR);
  138.         Push(&OPTR,'#');
  139.         InitStack(&OPND);
  140.         printf("请输入表达式\n");
  141.         c=getchar();
  142.         while(c!='#'||GetTop(OPTR)!='#')
  143.         {
  144.                 if(!In(c))
  145.                 {
  146.                         Push(&OPND,c);
  147.                         c=getchar();
  148.                 }
  149.                 else
  150.                 {
  151.                         switch(Priority(GetTop(OPTR),c))
  152.                         {
  153.                         case '<':Push(&OPTR,c);c=getchar();
  154.                                 break;
  155.                         case '=':Pop(&OPTR,&x);c=getchar();
  156.                                 break;
  157.                         case '>':Pop(&OPTR,&x);Pop(&OPND,&a);Pop(&OPND,&b);
  158.                                 i=atoi(&a);j=atoi(&b);
  159.                                 e=operate(j,x,i);
  160.                                 itoa(e,&a,10);
  161.                                 Push(&OPND,a);
  162.                                 break;
  163.                         }
  164.                 }
  165.         }
  166.         return (GetTop(OPND));

  167. }
  168. int main()
  169. {
  170.         char a;
  171.         a=final();
  172.         printf("%c",a);
  173.         printf("\n");
  174. }
复制代码
360截图20161014144045568.jpg




上一篇:出现这样是啥原因啊?
下一篇:常见排序算法
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-3-20 01:53

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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