资源简介
问题描述 设计一个模拟计算器功能的程序,它读入一个表达式,如果是一个正确的表达式(即它由操作数、圆括号和+、-、*、/四种运算符组成),则求出该表达式的值;否则给出某种错误信息。
基本要求:读入一个以字符序列形式给出的以等号(=)结尾的表达式;程序中应考虑运算符的优先级、运算的合法性。
代码片段和文件信息
#include
#include
using namespace std;
#define STACK_SIZE 50
#define STACKINCREMENT 20
struct optr
{
char* base;
char* top;
int stacksize;
};
struct opnd
{
double* base;
double* top;
int stacksize;
};
int InitStack(optr &S)
{
S.base=(char*)malloc(STACK_SIZE*sizeof(char));
if(!S.base)exit(-2);
S.top=S.base;
S.stacksize=STACK_SIZE;
return 1;
}
int InitStack(opnd &S)
{
S.base=(double*)malloc(STACK_SIZE*sizeof(double));
if(!S.base)exit(-2);
S.top=S.base;
S.stacksize=STACK_SIZE;
return 1;
}
int Push(optr &Schar e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char*)realloc(S.base(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)exit(-2);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Push(opnd &Sdouble e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(double*)realloc(S.base(S.stacksize+STACKINCREMENT)*sizeof(double));
if(!S.base)exit(-2);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
char GetTop(optr S)
{
char e;
if(S.top==S.base) return 0;
e=*(S.top-1);
return e;
}
double GetTop(opnd S)
{
double e;
if(S.top==S.base) return 0;
e=*(S.top-1);
return e;
}
char Pop(optr &S)
{
if(S.top==S.base)return 0;
return *--S.top;
}
double Pop(opnd &S)
{
if(S.top==S.base)return 0;
return *--S.top;
}
int In(char cchar op[8])
{
for(int i=0;i<8;i++)
if(c==op[i])return 1;
return 0;
}
char precede(char bchar c)
{
char YXJ[9][9]=
{
{‘ ‘‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘^‘‘=‘}
{‘+‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘<‘‘>‘}
{‘-‘‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘<‘‘>‘}
{‘*‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘<‘‘>‘}
{‘/‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘<‘‘>‘}
{‘(‘‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘<‘‘ ‘}
{‘)‘‘>‘‘>‘‘>‘‘>‘‘ ‘‘>‘‘>‘‘>‘}
{‘^‘‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘‘>‘}
{‘=‘‘<‘‘<‘‘<‘‘<‘‘<‘‘ ‘‘<‘‘=‘}
};
int i=0j=0;
while(i<9)
{
if(b==YXJ[i][0])break;
i++;
}
while(j<9)
{
if(c==YXJ[0][j])break;
j++;
}
return YXJ[i][j];
}
void main()
{
optr OPTR;opnd OPND;
InitStack(OPTR);InitStack(OPND);
Push(OPTR‘=‘);
char c[50]OP[8]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘=‘‘^‘};
cout<<“请输入待求值的表达式(!!!一定要以“=”号结束!!!):“< gets(c);int i=0ii=0aa=0tf=0;
while(c[ii]!=‘\0‘){aa++;ii++;}
while(c[i]!=‘\0‘&&(c[i]!=‘=‘||GetTop(OPTR)!=‘=‘))
{
if(!In(c[i]OP))
{
int x=0;
while(!In(c[i]OP)&&c[i]!=‘.‘)
{
x=10*x+(c[i]-48);
i++;
}
if(c[i]==‘.‘)i++;
double y=0;int j=0;
while(!In(c[i]OP))
{
j--;
y=y+(c[i]-48)*pow(10j);
i++;
}
Push(OPNDx+y);
}
else
switch(precede(GetTop(OPTR)c[i]))
{
case‘<‘:Push(OPTRc[i]);i++;break;
case‘=‘:Pop(OPTR);i++;break;
case‘>‘:double abd;char m;
m=Pop(OPTR);b=Pop(OPND);a=Pop(OPND);
if(m==‘+‘)d=a+b;
if(m==‘-‘)d=a-b;
if(m==‘*‘)d=a
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3432 2008-04-16 20:57 表达式求值\表达式求值.cpp
文件 283 2008-11-16 12:44 表达式求值\readme.txt
目录 0 2009-06-15 20:13 表达式求值
----------- --------- ---------- ----- ----
3715 3
相关资源
- 数据结构实验 基于栈的表达式求值
- 表达式求值C 代码(附实验报告)
- 数据结构算术表达式求值实验报告
- 数据结构 课程设计 中缀算术表达式求
- 表达式求值问题 数据结构
- 表达式求值 数据结构
- 《数据结构_课程设计》表达式求值
- 计算器计算表达式的
- 基于栈的算术表达式求值算法
- 表达式求值采用栈实现
- 数据结构-利用栈求表达式的值
- 数据结构课程设计表达式求值
- 数据结构 栈 表达式求值
- 算数表达式求值C实现
- 中缀表达式求值
- 算术表达式求值源码+实验报告
- 数据结构实验报告3-栈与队列-中缀表
- 中缀表达式转后缀表达式并求值
- 数据结构课程设计 表达式求值
- 用栈实现表达式求值,后缀表达式转
- 表达式求值 算法 代码 报告 流程图
- 设计一个程序,演示用算符优先法对
- OC利用栈实现数学表达式求值
- 数据结构表达式求值实验报告
- 表达式求值算法-算符优先法
- 中缀表达式到后缀表达式的转换后缀
- 数据结构中算术表达式求值课程设计
评论
共有 条评论