数据结构,栈的应用:简单表达式求值

//未完成:只能执行输入正确的表达式,健壮性为0
//写代码过程出现问题:①循环判断两个方向:1、c=#时退出,发现不能运行到最后的结果  2、运算符栈OPTR为空时退出,出现一个问题,结束之后还有一行 c=getchar() 导致不能继续循环,所以加了一个if语句,再转到语句标号为OP。

②free()之后,base不是为NULL值,所以得自己加上;③超过9的数的运算用上 i;④出栈的数第一个为后面的操作数!!

#include<stdio.h>
#include<stdlib.h>
typedef struct data1
{
 char b;
 data1 *next;
}data1;
typedef struct
{
 data1 *base;
 data1 *top;
}a,*Link1;
typedef struct data2
{
 int b;
 data2 *next;
}data2;
typedef struct
{
 data2 *base;
 data2 *top;
}b,*Link2;
void InitStack1(Link1 &L);
void InitStack2(Link2 &L);    //初始化
void Push1(Link1 &L,char c);
void Push2(Link2 &L,int c,int i);   //入栈
char Pop1(Link1 &L);
int Pop2(Link2 &L);         //出栈
char GetTop(Link1 L);         //栈顶元素
//int In(char c,char a[7]);    //判断是否是运算符
char Precede(char a,char b); //比较两个运算符优先关系
int Operate(int x,char theta,int y);

//字符和数字转换,思维误区:只需要int b;b=char-48
int main()
{
 Link1 OPTR;
 Link2 OPND;
 int i=-1,j;
 char c,theta;
 char a[7]={'+','-','*','/','(',')','#'};
 int x,y;//运算
 InitStack1(OPTR); InitStack2(OPND);
 Push1(OPTR,'#');
 printf("请输入一个表达式:(结尾输入#)\n");
 c=getchar();
 while(1)
 {
  if(c>='0'&&c<='9')
  {
   j=c-48;
   Push2(OPND,j,i);
   c=getchar();
   i++;//
  }
  else
  {
   i=-1;//
   switch(Precede(GetTop(OPTR),c))
   {
   case '<':
    Push1(OPTR,c);
    c=getchar();  break;
   case '=':
    Pop1(OPTR);
    if(OPTR->base->next==NULL) goto OP;//判断结束,转到OP
    else c=getchar();
    break;
   case '>':
    theta= Pop1(OPTR);
    x    = Pop2(OPND);
    y    = Pop2(OPND);
    Push2(OPND,Operate(x,theta,y),i);
    break;
   }
  }
 }
OP:printf("表达式运算结果为:%d\n",OPND->top->b);  //OP
 return 0;
}
void InitStack1(Link1 &L)
{
 L=(Link1)malloc(sizeof(a));
 L->base=(data1 *)malloc(sizeof(data1));
 L->base->next=NULL;
 L->top=L->base;
}
void InitStack2(Link2 &L)
{
 L=(Link2)malloc(sizeof(b));
 L->base=(data2 *)malloc(sizeof(data2));
 L->base->next=NULL;
 L->top=L->base;
}
void Push1(Link1 &L,char c)   //入栈
{
 data1 *p;
 p=(data1*)malloc(sizeof(data1));
 L->top->next=p;
 p->next=NULL;
 p->b=c;
 L->top=p;
}
void Push2(Link2 &L,int c,int i)
{
 if(i==-1)
 {
     data2 *p;
     p=(data2*)malloc(sizeof(data2));
     L->top->next=p;
     p->next=NULL;
     p->b=c;
     L->top=p;
 }
 else
 {
  L->top->b=L->top->b*10+c;
 }
}
char Pop1(Link1 &L)           //出栈
{
 char e;
 data1 *p=L->base;
 while(p->next!=L->top) p=p->next;
 e=L->top->b;
 L->top=p;
 L->top->next=NULL;
 p=p->next;
 free(p);
 return e;
}
int Pop2(Link2 &L)
{
 int e;
 data2 *p=L->base;
 while(p->next!=L->top) p=p->next;
 e=L->top->b;
 L->top=p;
 p=p->next;
 free(p);
 return e;
}
char GetTop(Link1 L)         //栈顶元素
{
 return L->top->b;
}
/*int In(char c,char a[7])    //判断是否是运算符
{
 int i=0;
 for(i;i<7;i++)
 {
  if(c==a[i]) return 1;
 }
 return 0;
}*/
char Precede(char a,char b) //比较两个运算符优先关系
{
 switch(a)
 {
 case '+':
       if(b=='+') return '>';
  else if(b=='-') return '>';
  else if(b=='*') return '<';
  else if(b=='/') return '<';
  else if(b=='(') return '<';
  else if(b==')') return '>';
  else            return '>';
  break;
 case '-':
       if(b=='+') return '>';
  else if(b=='-') return '>';
  else if(b=='*') return '<';
  else if(b=='/') return '<';
  else if(b=='(') return '<';
  else if(b==')') return '>';
  else            return '>';
  break;
 case '*':
       if(b=='+') return '>';
  else if(b=='-') return '>';
  else if(b=='*') return '>';
  else if(b=='/') return '>';
  else if(b=='(') return '<';
  else if(b==')') return '>';
  else            return '>';
  break;
 case '/':
       if(b=='+') return '>';
  else if(b=='-') return '>';
  else if(b=='*') return '>';
  else if(b=='/') return '>';
  else if(b=='(') return '<';
  else if(b==')') return '>';
  else            return '>';
  break;
 case '(':
       if(b=='+') return '<';
  else if(b=='-') return '<';
  else if(b=='*') return '<';
  else if(b=='/') return '<';
  else if(b=='(') return '<';
  else            return '=';
  break;
 case ')'://??
       if(b=='+') return '>';
  else if(b=='-') return '>';
  else if(b=='*') return '>';
  else if(b=='/') return '>';
  else if(b==')') return '>';
  else            return '>';
  break;
 case '#':
       if(b=='+') return '<';
  else if(b=='-') return '<';
  else if(b=='*') return '<';
  else if(b=='/') return '<';
  else if(b=='(') return '<';
  else            return '=';
  break;
 }
}
int Operate(int x,char theta,int y)
{
 int n;
 if(theta=='+') n=y+x;
 else if(theta=='-') n=y-x;
 else if(theta=='*') n=y*x;
 else n=y/x;
 return n;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值