中缀表达式简单算术表达式的C++求解Word文档格式.docx
- 文档编号:22662067
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:64.96KB
中缀表达式简单算术表达式的C++求解Word文档格式.docx
《中缀表达式简单算术表达式的C++求解Word文档格式.docx》由会员分享,可在线阅读,更多相关《中缀表达式简单算术表达式的C++求解Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
****************)
#include<
iostream>
#include<
math.h>
stdio.h>
stdlib.h>
usingnamespacestd;
template<
typenameT>
voidinitStack(T*s,intm,int*top)
{
s=newT(m);
//动态申请容量为m的存储空间
*top=0;
//栈顶指针
return;
//当前分配的栈空间
}
voidpush(T*s,intm,int*top,Tx)
if(*top==m)
{cout<
<
"
Stackoverflow!
"
endl;
return;
*top=*top+1;
//序号指针递增
s[*top-1]=x;
//入栈
Tpop(T*s,intm,int*top)
Ty;
if(*top==0)
Stackunderflow!
y=s[*top-1];
//退栈
*top=*top-1;
//序号指针递减
return(y);
//返回栈顶元素
intOperate(inta,chare,intb)//运算操作
intc;
switch(e)
{
case'
+'
:
{c=a+b;
break;
}
-'
{c=a-b;
*'
{c=a*b;
/'
{c=a/b;
^'
{c=pow(a,b);
default:
printf("
error\n"
);
returnc;
charPrecede(charch1,charch2)
{
charch;
switch(ch1)
{
switch(ch2)
)'
\n'
ch='
>
'
;
break;
case'
('
}
if(ch2=='
||ch2=='
)
else
)
='
return(ch);
}
intEvaluateExpression()
charc,theta;
inta,b,answer;
T:
OPTR,OPND;
initStack(OPTR);
push(OPTR,'
initStack(OPND);
c=getchar();
while(c!
||GetTop(OPTR)!
='
){//边输入边处理
if(!
In(c,OP)){push(OPND,c);
//不是运算符则进栈,In(c,OP)判断c是否是运算符
else
switch(Precede(GetTop(OPTR),c))
{
case<
//新输入的算符c优先级高,c进栈
push(OPTR,c);
case=:
//脱括号并接收下一字符
pop(OPTR,x);
case>
//新输入的算符c优先级低(栈顶算符优先级高)
//出栈并将运算结果入栈OPND
pop(OPTR,theta);
pop(OPND,b);
Pop(OPND,a);
push(OPND,Operate(a,theta,b));
break;
}//switch
}//while
answer=GetTop(OPND);
cout<
answer<
return0;
intmain()
EvaluateExpression();
此程序运行过程中,编译没错,可一到连接就出现这个问题:
1unresolvedexternals!
再三思考,我放弃了这个方案,通过XX搜索,我找到一个以#结束,不能乘方运算,没有详细错误提示的程序,其思路与老师的方案大致相同,只不过采用了数组的形式,不过都对中缀表达式的长度没有确定的要求。
经过一整天的编辑,我终于完成并调试成功了这个程序,心里充满了成功的喜悦感!
以下是我的最终程序(与软件1.cpp内容相同):
#include"
iostream.h"
stdlib.h"
math.h"
time.h"
#defineTRUE1
#defineFALSE0
#defineERROR-1
typedefintStatus;
//用模板实现的链式结构堆栈类
classT>
classstack{
private:
structlink{
Tdata;
//结点数据域
link*next;
//下一结点指针
link(TData,link*Next){//结构体构造函数
data=Data;
next=Next;
}*head;
//堆栈顶指针
public:
stack();
//构造函数(初始化栈)
~stack();
//析构函数(销毁栈)
voidpush(TData);
//压栈操作
Tgettop()const;
//取栈顶元素
Tpop();
//出栈操作
Tgetvalue(intindex);
//返回栈底开始第INDEX个栈中值
voidtraverse(intn);
//遍历栈N个数换行
intempty();
//判断栈是否为空,1是,0非
intsizeofstack();
//返回栈的大小
voidclear();
//清空栈
};
//类模板成员函数的实现
template<
stack<
T>
stack()//构造函数
head=0;
~stack()//析构函数
link*cursor=head;
while(head)
cursor=cursor->
next;
deletehead;
head=cursor;
voidstack<
push(TData)//压栈操作
head=newlink(Data,head);
Tstack<
gettop()const//取栈顶元素
returnhead->
data;
pop()//出栈操作
if(head==0)return0;
Tresult=head->
link*oldhead=head;
head=head->
deleteoldhead;
returnresult;
getvalue(intindex)//返回栈底开始第INDEX个栈中值
link*cursor=head;
inti=1;
intstacklen=sizeofstack();
if(index<
=0||index>
stacklen)return0;
while(i<
=(stacklen-index))
i++;
returncursor->
voidstack<
traverse(intn)//遍历栈
link*cursor=head;
intiEnterSign=1;
//换行标识
while(cursor)
cout<
cursor->
data<
if(iEnterSign%n==0)cout<
iEnterSign++;
if((iEnterSign-1)%n!
=0)cout<
intstack<
empty()//判断栈是否为空,1是,0非
returnhead==0?
1:
0;
sizeofstack()//返回栈的大小
intsize=0;
size++;
returnsize;
clear()//清空栈
while(cursor&
&
next)
intOperator(charch)
if(ch=='
||ch=='
\r'
return(TRUE);
else
return(FALSE);
#'
elseif(ch2=='
||ch2=='
doublecalc(doublex,charch,doubley)
doublez;
switch(ch)
case'
z=x+y;
z=x-y;
z=x*y;
z=x/y;
z=pow(x,y);
return(z);
doublemiddexpression(char*exp)//求解中缀表达式
double>
*opnd=new(stack<
char>
*optr=new(stack<
charch=*exp;
doublex=0,y,z;
doubleresult;
optr->
push('
while(ch!
\0'
//cout<
ch<
endl<
//用于检验
if(ch>
0'
9'
x=ch-48;
opnd->
push(x);
ch=*++exp;
cout<
不符合要求,运算数必须是0~9之间的数"
exit(0);
elseif(Operator(ch))
switch(Precede(optr->
gettop(),ch))
//栈顶元素优先权低
push(ch);
if(ch=='
表达式错误,操作符不能用作结尾!
}
//脱括号并接收下一字符
pop();
不符合要求,右括号后没有运算符!
//退栈并将运算结果入栈
if(opnd->
sizeofstack()<
2)
数字不够,表达式不合法!
x=opnd->
y=opnd->
z=calc(y,optr->
pop(),x);
push(z);
z<
x=0;
elseif(ch!
!
Operator(ch)&
ch!
'
不符合要求,只能进行:
+,-,*,/,^,(,)运算!
elseif(ch!
ch=='
不符合要求,中缀表达式中不允许包含多余的空格!
输入不合法!
while(opnd->
sizeofstack()>
=2)
if(optr->
gettop()=='
cout<
表达式中的'
没有'
与之相对应!
gettop(),'
))
{
}
result=(opnd->
pop());
return(result);
voidmain(void)//程序入口函数
charexp[800];
请输入中缀表达式(以回车键结束):
cin.getline(exp,800);
middexpression(exp)<
}整个程序化费了我将近两整天的功夫,而且到现在我编的第一个程序还不知道错在了哪里,恳求老师的邮件指导,在此不甚感激。
本次试验让我回顾了C++的编程内容,初步掌握了堆栈的使用,让我受益匪浅~~~~
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中缀 表达式 简单 算术 C+ 求解