#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<malloc.h>
#define size 100
#define size_1 10
typedef char Elemtype;
void InitStack ();
void Push();void function();
void Pop();
char sign(char ch1,char ch2);
char firstvalue(char ch);
typedef struct {
Elemtype *top;
Elemtype *base;
Elemtype stackSize;
}sqStack;
void InitStack (sqStack *s){
s->base=(Elemtype *)malloc(size * sizeof(Elemtype));
if(!s->base){
exit(0);
}
s->top=s->base;
s->stackSize=size;
}
void Push(sqStack *s,Elemtype e){
if(s->top - s->base >= s->stackSize){
s->base=(Elemtype *)realloc(s->base,(s->stackSize+size_1)* sizeof(Elemtype));
if(!s->base) exit(0);
}
*(s->top)=e;
s->top++;
}
void Pop(sqStack *s,char *e){
if(s->top == s->base)
return;
*e=*--(s->top);
}
int count(char b,char h,char a)
{
int i=0;
switch(a)
{
case '+':i=(h-'0')+(b-'0'); printf("执行了加法\n");;break;
case '-':i=(b-'0')-(h-'0'); printf("执行了减法\n");break;
case '*':i=(b-'0')*(h-'0'); printf("执行了乘法\n");break;
case '/':i=(b-'0')/(h-'0'); printf("执行了除法\n");break;
default:printf("错误\n");break;}
return i;
}
char firstvalue(char ch)
{
int k=0;
switch(ch)
{
case '+':k=0;break;
case '-':k=1;break;
case '*':k=2;break;
case '/':k=3;break;
case '(':k=4;break;
case ')':k=5;break;
case '#':k=6;break;
}
return k;}
char sign(char ch1,char ch2)
{
int i,j;
char a[7][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
i=firstvalue(ch1);
j=firstvalue(ch2);//调用函数两次,返回两个函数值
return a[i][j];
}
int main(){
char a,e;
char n,c,b,k,h;
sqStack s1,s2;
InitStack(&s1);
InitStack(&s2);
Push(&s1,'#');
printf("请输入表达式,以#结尾\n");
c=getchar();
while(c!='#'||*(s1.top-1)!='#') {
if(c<='9'&&c>='0'){
Push(&s2,c);
c=getchar();
printf("已经压栈数字\n\n");
}
else
switch(sign(*(s1.top-1),c))
{
case'<':printf("已经执行1\n\n");Push(&s1,c);c=getchar();break;
case'=':Pop(&s1,&e);printf("已经执行9\n\n");break;
case'>':Pop(&s1,&a);Pop(&s2,&b);printf("b为:%c\n",b);Pop(&s2,&h);printf("h为:%c\n",h);n=count(b,h,a);printf("n为:%d \n\n",n);Push(&s2,n);printf("已经执行2 \n\n");break;
}}
Pop(&s2,&k);
printf("结果为:%d \n",k);
return 0;
}