利用栈求表达式的值,可供小学生作业,并能给出分数。
要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。
这个工程有点大 如果有人专门做这个要花费几个小时
#include<stdio.h>
#include<stlib.h>
#include<string.h>
#define NUULLO
#define Ok 1
#define ERROR -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 20//定义字符类型栈
typedef struct{
int stracksize;
char *base;
char *top;
}
Stack;//定义整形栈
typedef struct{
int stacksize;
int *base,*top;
}
Stack;
Stack OPTR;//定义运算符栈
Stack OPND;//定义操作数栈
char expr[200]=" ";//存放表达式串
char *ptr=expr;
Int InitStack(Stack *s)//构造运算符栈
{s->base=(char*)malloc(STACK_INIT_SIZE*sizeof((char));
if(!s->base)return ERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int InitStack 2(stack2 *s)//构造操作数栈
{{s->base=(int*)malloc(STACK_INIT_SIZE*sizeof((int));
if(!s->base)return ERROR;
s->stacksize=STACK_INIT_SIZE;
s->top=s->base;
return OK;
}
int Push(Stack *s,char ch)//运算符栈插入以ch为新的栈顶元素
{
*s->top=ch;
s->top++;
return 0;
}
int Push2(Stack2*s,int ch)//操作数栈插入以ch为新的栈顶元素
{*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack*s)//删除运算符栈S的栈顶元素,用p返回其值
{
char p;
s->top--;
p=*s->top;
return p;
}
int Pop2(Stack2*s)//删除操作数栈S的栈顶元素,用p返回其值
{
int p;
s->top--;
p=*s->top;
return p;
}
char GetTop(Stack s)//用p返回运算符栈的栈顶元素
{char p=*(S.top-1);
return p;
}
int GetTop(Stack s)//用p返回操作数栈的栈顶元素
{int p=*(S.top-1);
return p;
}
//判断运算符优先级返回优先级高的
char Precede(char c1,char c2)
{int i=0,j=0;
static char array[49]={
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','!',
'>','>','>','>','!','>','>',
'<','<','<','<','<','!','=',
};
switch(c)//i为array的横标
{case'+':i=0;break;
case'-':i=1;break;
case'*':i=2;break;
case'/':i=3;break;
case'(':i=4;break;
case')':i=5;break;
case'#':i=6;break;
}
switch(2)//j为array的纵标
{case'+':j=0;break;
case'-':j=1;break;
case'*':j=2;break;
case'/':j=3;break;
case'(':j=4;break;
case')':j=5;break;
case'#':j=6;break;
}
return(array[7*i+j];//返回运算符
}
int Operate(int a,char op,int b)
{switch(op)
{case'+': return(a+b);
case'-':return(a-b) ;
case'*':return(a*b);
case'/':return(a/b);
}
return 0;
}
int num(int n)//返回操作数的长度
{char p[10];
itoa(n,p,10);//把整形转换成字符型
n=strlen(p);
return n;
}
int Eval Expr()//主要操作函数
{char c,theta,x;
int n,m;
int a,b;
c-*ptr++;
while(c!='#'//GetTop(OPTR)!='#')
{if(!In(c))
{if(!In(*(ptr-1))) ptr=ptr-1 ;
m=atoi(ptr);
n=num(m);
Push2(&OPND,m);
ptr=ptr+n;
c=*ptr++;
}else
switch(Precede(GetTop(OPTR),c))
{
case'<':Push(&OPTR,c);
c=*ptr++;
Break;
case'=':x=Pop(&OPTR);
c=*ptr++;
break;
case'>':theta=Pop(&OPTR);
b=Pop2(&OPND);
a=Pop2(&OPND);
Push2(&OPND,Opearate(a,theta,b));
break;
}
}
return GetTop2(OPND);
}
int main()
{
printf("请输入以#结尾的算术表达式");
Do{
gets(expr);
}
while(!*expr);
InitStack(&OPTR);//初始化运算符栈
Push(&OPTR,'#');//将#压入栈底
InitStack2(&OPND);//初始化操作数栈
printf("表达式结果为:%d\n",EvalExpr());
return 0;
}