利用栈求表达式的值
要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价
#include<iostream>
#include"conio.h"
#define maxsize 100
#include "ctype.h"
typedef char datatype;
typedef struct
{
datatype stack[maxsize];
int top;
} seqstack;
#define STACK_INIT_SIZE 100
template <class T>
class stack
{
private:
T*base;
T *top;
int stacksize;
public:
stack()
{
InitStack(seqstack *);
}
~stack()
{
if()
{
delete[]base;
}
}
void InitStack(seqstack *s); // 创建栈
int noempty(seqstack s)
void Push(seqstack *s); // 向栈中放入数据[压栈]
void Pop(seqstack *s,datatype *d); // 从栈中取数据[弹栈]
int GetTop(seqstack s,datatype *d); // 查看栈顶数据
};
template <class T>
void stack<T>:: InitStack(seqstack *s) // 创建栈
{
s->top=0;
}
template <class T>
int stack<T>:: noempty(seqstack s)
{
if(s.top<=0) return 0;
else return 1;
}
template <class T>
void stack<T>:: Push(seqstack *s, datatype x) // 向栈中放入数据[压栈]
{ if(s->top>=maxsize)
{
cout<<"堆栈已满无法插入!"<<endl;
return 0;
}
else
{
s->stack[s->top]=x;
s->top++;
return 1;
}
}
template <class T>
void stack<T>:: Pop(seqstack *s,datatype *d) // 从栈中取数据[弹栈]
{ if(s->top<=0)
{
cout<<"堆栈已空无数据元素出栈!"<<endl;
return 0;
}
else
{
s->top--;
*d=s->stack[s->top];
return 1;
}
}
template <class T>
T stack<T>::GetTop(seqstack s,datatype *d) // 查看栈顶数据
{
if(s.top<=0)
{
cout<<"堆栈已空!"<<endl;
return 0;
}
else
{
*d=s.stack[s.top-1];
return 1;
}
}
void expiscorrect(char exp[], int n)
{
seqstack mystack;
int i;
char c;
InitStack(&mystack);
for(i=0;i<n;i++)
{
if(exp[i]=='(')
Push(&mystack, exp[i]);
else if((exp[i]==')') && notempty(mystack) && GetTop(mystack,&c) && c=='(')
Pop(&mystack,&c);
else if((exp[i]==')') && !notempty(mystack))
{
cout<<"右括号多余左括号!"<<endl;
return ;
}
}
if(notempty(mystack))
cout<<"左括号多余右括号!"<<endl;
else
cout<<"左右括号匹配正确!"<<endl;
}
static float ans[50];
static int count=0;
static int right=0;
static float yourresult[50];
int postexp(char exp[])
{
seqstack mystack;
datatype x1,x2;
int i;
int j=0,ls;
int top=0;
int isFalse=0;
int isRead=0;
char oprator = ' ';
InitStack(&mystack);
for(i=0;exp[i]!='#';i++)
{
if(isdigit(exp[i]))
{
top=(int)(exp[i]-48);
top*=10;
}
else
{
if (isRead == 0)
{
isRead++;
top/=10;
Push(&mystack,top);
oprator = exp[i];
top=0;
}
else if (isRead == 1)
{
Push(&mystack,top);
if (isRead == 1)
{
isRead++;
Pop(&mystack,&x2);
}
stackpop(&mystack,&x1);
ls=x1;x1=x2;x2=ls;
x1/=10;
switch(oprator)
{
case '+': {x1+=x2;break;}
case '-': {x1-=x2;break;}
case '*': {x1*=x2;break;}
case '/':
{
if(x2==0.0)
{
cout<<"除数为0错!"<<endl;
isFalse=1;
}
else
{
x1/=x2;
}
};break;
}
oprator = exp[i];
x2=x1;
top=0;
}
}
}
if (isRead == 0)
{
isRead++;
top/=10;
Push(&mystack,top);
oprator = exp[i];
top=0;
}
else if (isRead == 1)
{
Push(&mystack,top);
if (isRead == 1)
{
isRead++;
Pop(&mystack,&x2);
}
Pop(&mystack,&x1);
ls=x1;x1=x2;x2=ls;
x1/=10;
switch(oprator)
{
case '+': {x1+=x2;break;}
case '-': {x1-=x2;break;}
case '*': {x1*=x2;break;}
case '/':
{
if(x2==0.0)
{
cout<<"除数为0错!"<<;
isFalse=1;
}
else
{
x1/=x2;
}
};break;
}
oprator = exp[i];
x2=x1;
top=0;
}
if (isFalse == 1) return -1;
ans[count] = x1;
cout<<"请输入您计算的结果:"<<endl;
cin>>"%f">>&yourresult[count];
if(ans[count]==yourresult[count]) right++;
count++;
}
int main()
{
int i=0;
char exp[100];
cout<<" ------计算表达式------\n使用说明:"<<endl;
cout<<" 1.请输入要计算的表达式,以#结尾,例如1+2#"<<endl;
cout<<" 2.结束计算请输入符号$"<<endl;
cout<<" 3.在表达式中可以运算括号,中括号[]和大括号{}统一使用小括号代替()!"<<endl;
cout<<" 4.程序输入格式错误时,将会自动结束程序,请注意格式正确!"<<endl;
cout<<"请输入要计算的表达式,以#结尾。结束程序输入$。"<<endl;
cin>>"%s">>exp[i];
while(exp[i]!='$')
{
expiscorrect(&exp[i],i);
postexp(&exp[i]);
cout<<"-------------------------------------------\n"<<endl;
cout<<"请输入下一个表达式,以#结尾。结束程序输入$。\n"<<endl;
cin>>"%s">>exp[i];
}
cout<<"\n\n ******您的成绩单*******\n"<<endl;
cout<<"----------------------------------------\n"<<endl;
cout<<" 序 号 正确答案 您的答案 结 论\n"<<endl;
for(i=0;i<count;i++)
{
cout<<"表达式%d %.2f %.2f %s\n"<<
i+1<<ans[i],yourresult[i],ans[i]==yourresult[i]?"正确!":"错误!");
}
cout<<"----------------------------------------\n"<<endl;
cout<<"解答题目总共为%d道,其中\n"<<count<<endl;
cout<<"正确解答%d道题,错误解答%d道题。\n *****最后得分为%d分!*****\n"<< right<<count-right<<right*100/count<<endl;
cout<<"----------------------------------------\n"<<endl;
return 0;
}