//未完成:只能执行输入正确的表达式,健壮性为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;
}