堆栈的应用计算数学表达式的值迷宫.docx
- 文档编号:3655977
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:15
- 大小:16.47KB
堆栈的应用计算数学表达式的值迷宫.docx
《堆栈的应用计算数学表达式的值迷宫.docx》由会员分享,可在线阅读,更多相关《堆栈的应用计算数学表达式的值迷宫.docx(15页珍藏版)》请在冰豆网上搜索。
堆栈的应用计算数学表达式的值迷宫
堆栈的应用计算数学表达式的值、迷宫
实验四堆栈的应用
一、实验目的
掌握堆栈的使用。
二、实验内容
1、计算数学表达式的值。
输入数学表达式,输出表达式的计算结果。
数学表达式由单个数字和运算符"+"、"-"、"*"、"/"、"(、")构成,例如2+3*(4+5)–6/4。
假定表达式输入格式合法。
*2、以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
迷宫根据一个迷宫数据文件建立。
迷宫数据文件由一个包含0、1的矩阵组成。
迷宫的通路可以使用通路上各点的坐标序列进行展示(使用图形展示最佳)。
*计算数学表达式的值*
*在此没先转成后缀表达式,代码写得不好*
#pragmaonce
#include"NoMem.h"
#include"OutOfBounds.h"
templateclassT
classStack
{
public:
Stack(intMaxStackSize=10);
~Stack(){deletestack;}
boolIsEmpty()const{returntop==-1;}
boolIsFull()const{returntop==MaxTop;}
TTop()const;
StackT&Add(constT&x);
StackT&Delete(T&x);
private:
inttop;
intMaxTop;
T*stack;
};
templateclassT
StackT:
Stack(intMaxStackSize)
{
MaxTop=MaxStackSize-1;
stack=newT[MaxStackSize];
top=-1;
}
templateclassT
TStackT:
Top()const
{
if(IsEmpty())throwOutOfBounds();
elsereturnstack[top];
}
templateclassT
StackT&StackT:
Add(constT&x)
{
if(IsFull())throwNoMem();
stack[++top]=x;
return*this;
}
templateclassT
StackT&StackT:
Delete(T&x)
{
if(IsEmpty())throwOutOfBounds();
x=stack[top--];
return*this;
}
*
#pragmaonceclassOutOfBounds
{
public:
OutOfBounds(void){}
~OutOfBounds(void){}
};
*
#pragmaonceclassNoMem
{
public:
NoMem(void){}
~NoMem(void){}
};
*
//exp4计算数学表达式的值.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#includestring
#include"Stack.h"
#includeiostreamusingnamespacestd;
constintMaxLength=100;
floatcount(constchar*expr)
{
Stackcharsign(MaxLength);
Stackfloatdata(MaxLength);
sign.Add('#');
floatj,k;
chartemp;
intlength=strlen(expr);
for(inti=0;ilength;i++){
//cout"test:
"expr[i]"sign:
"sign.Top()endl;
if(expr[i]!
='+'&&expr[i]!
='-'&&expr[i]!
='*'&&expr[i]!
='/'&&expr[i]!
='('&&expr[i]!
=')')//expr[i]为数据
{
if(sign.Top()!
='*'&&sign.Top()!
='/')//expr[i]为数据且符号栈的顶部不是*或/
{
data.Add((float)expr[i]-48);
//cout"data:
"data.Top();
}
elseif(sign.Top()=='*')//符号栈的顶部为'*'
{
data.Delete(j);
j=j*((float)expr[i]-48);
//cout"dataj:
"jendl;
data.Add(j);
sign.Delete(temp);
//coutsign.Top();
}
else//符号栈的顶部为'/'
{
data.Delete(j);
j=j/((float)expr[i]-48);
data.Add(j);
sign.Delete(temp);
}
}
elseif(expr[i]=='('||expr[i]=='*'||expr[i]=='/'){
sign.Add(expr[i]);
//cout"aaa:
"sign.Top();
}
elseif(expr[i]=='+'||expr[i]=='-')
{
if(sign.Top()!
='+'&&sign.Top()!
='-')
{
sign.Add(expr[i]);
//cout"sign+:
"sign.Top();
}
elseif(sign.Top()=='+')
{
data.Delete(j);
data.Delete(k);
k=j+k;
data.Add(k);
sign.Delete(temp);
sign.Add(expr[i]);
}
else
{
data.Delete(j);
data.Delete(k);
k=k-j;
data.Add(k);
sign.Delete(temp);
sign.Add(expr[i]);
}
}
else//expr[i]为')'
{
if(sign.Top()=='+'){
data.Delete(j);
data.Delete(k);
k=j+k;
data.Add(k);
sign.Delete(temp);
sign.Delete(temp);
if(sign.Top()=='*'){
data.Delete(j);
data.Delete(k);
k=j*k;
data.Add(k);
sign.Delete(temp);
}
elseif(sign.Top()=='/'){
data.Delete(j);
data.Delete(k);
k=k/j;
data.Add(k);
sign.Delete(temp);
}
}
elseif(sign.Top()=='-'){
data.Delete(j);
data.Delete(k);
k=k-j;
data.Add(k);
sign.Delete(temp);
sign.Delete(temp);
if(sign.Top()=='*'){
data.Delete(j);
data.Delete(k);
k=j*k;
data.Add(k);
sign.Delete(temp);
}
elseif(sign.Top()=='/'){
data.Delete(j);
data.Delete(k);
k=k/j;
data.Add(k);
sign.Delete(temp);
}
}
else
{
sign.Delete(temp);
}
}
}
if(!
(sign.Top()=='#')){
if(sign.Top()=='+')
{
data.Delete(j);
data.Delete(k);
k=j+k;
data.Add(k);
//cout"last:
"sign.Top();
sign.Delete(temp);
}
elseif(sign.Top()=='-'){
data.Delete(j);
data.Delete(k);
k=k-j;
data.Add(k);
//cout"last-:
"sign.Top();
sign.Delete(temp);
}
}
returndata.Top();
}
int_tmain(intargc,_TCHAR*argv)
{
charexpr[MaxLength];
cout"Typeanexpressionoflengthatmost"MaxLengthendl;
cin.getline(expr,MaxLength);
cout"Theresultis:
"count(expr);
system("pause");
return0;
}
*迷宫*
#pragmaonceclassPosition
{
public:
friendboolFindPath();
friendvoidOutputPath();
Position(void){}
~Position(void){}
private:
introw;
intcol;
};
*
#pragmaonce
#include"NoMem.h"
#include"OutOfBounds.h"
templateclassT
classStack
{
public:
Stack(intMaxStackSize=10);
~Stack(){deletestack;}
boolIsEmpty()const{returntop==-1;}
boolIsFull()const{returntop==MaxTop;}
TTop()const;
StackT&Add(constT&x);
StackT&Delete(T&x);
private:
inttop;
intMaxTop;
T*stack;
};
templateclassT
StackT:
Stack(intMaxStackSize)
{
MaxTop=MaxStackSize-1;
stack=newT[MaxStackSize];
top=-1;
}
templateclassT
TStackT:
Top()const
{
if(IsEmpty())throwOutOfBounds();
elsereturnstack[top];
}
templateclassT
StackT&StackT:
Add(constT&x)
{
if(IsFull())throwNoMem();
stack[++top]=x;
return*this;
}
templateclassT
StackT&StackT:
Delete(T&x)
{
if(IsEmpty())throwOutOfBounds();
x=stack[top--];
return*this;
}
*
#pragmaonceclassNoMem
{
public:
NoMem(void){}
~NoMem(void){}
};
*
#pragmaonceclassOutOfBounds
{
public:
OutOfBounds(void){}
~OutOfBounds(void){}
};
*
//maze.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#includeiostream
#include"Stack.h"
#include"Position.h"
usingnamespacestd;
int*maze,m,n;//m行n列的迷宫
StackPosition*path;
voidInputMaze()
{
cout"Pleaseinputthenumberofrowandcol";
cinmn;
//maze=newint[m+1][n+1];
maze=newint*[m+2];
maze[0]=newint[n+2];
maze[m+1]=newint[n+2];
for(intk=1;k=m;k++)
{
maze[k]=newint[n+2];
cout"inputthe"k"'throw:
";
//cin.getline(maze[k],n);
for(inti=1;i=n;i++){
cinmaze[k][i];
}
coutendl;
}
}
boolFindPath()
{
path=newStackPosition(m*n-1);
Positionoffset[4];
offset[0].row=0;offset[0].col=1;
offset[1].row=1;offset[1].col=0;
offset[2].row=0;offset[2].col=-1;
offset[3].row=-1;offset[3].col=0;
//maze[0]=newint*[n+2];
//maze[m+1]=newint*[n+2];
//initializewallofobstaclesaroundmazefor(inta=0;a=m+1;a++)
maze[a][0]=maze[a][n+1]=1;//leftandrightfor(intj=0;j=n+1;j++)
maze[0][j]=maze[m+1][j]=1;//topandbottomPositionhere;
here.row=1;
here.col=1;
maze[1][1]=1;
intoption=0;
intLastOption=3;
//searchforapathwhile(here.row!
=m||here.col!
=n)
{
intr,c;
while(option=LastOption){
r=here.row+offset[option].row;
c=here.col+offset[option].col;
if(maze[r][c]==0)break;
option++;
}
//wasaneighborfound?
if(option=LastOption)
{
path-Add(here);
here.row=r;
here.col=c;
maze[r][c]=1;
option=0;
}
else
{
if(path-IsEmpty())returnfalse;
Positionnext;
path-Delete(next);
if(next.row==here.row)
option=2+next.col-here.col;
elseoption=3+next.row-here.row;
here=next;
}
}
returntrue;
}
voidOutputPath()
{
intx,y;
while(!
(path-IsEmpty()))
{
Positionpos;
path-Delete(pos);
x=pos.row;
y=pos.col;
maze[x][y]=2;
}
maze[m][n]=2;
for(inti=1;i=m;i++){
for(intj=1;j=n;j++)
coutmaze[i][j];
coutendl;
}
}
int_tmain(intargc,_TCHAR*argv)
{
InputMaze();
if(FindPath())
OutputPath();
elsecout"Nopath"endl;
system("pause");
return0;
}
MSN空间完美搬家到新浪博客!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈 应用 计算 数学 表达式 迷宫