堆栈的应用计算数学表达式的值迷宫.docx

上传人:b****3 文档编号:3655977 上传时间:2022-11-24 格式:DOCX 页数:15 大小:16.47KB
下载 相关 举报
堆栈的应用计算数学表达式的值迷宫.docx_第1页
第1页 / 共15页
堆栈的应用计算数学表达式的值迷宫.docx_第2页
第2页 / 共15页
堆栈的应用计算数学表达式的值迷宫.docx_第3页
第3页 / 共15页
堆栈的应用计算数学表达式的值迷宫.docx_第4页
第4页 / 共15页
堆栈的应用计算数学表达式的值迷宫.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

堆栈的应用计算数学表达式的值迷宫.docx

《堆栈的应用计算数学表达式的值迷宫.docx》由会员分享,可在线阅读,更多相关《堆栈的应用计算数学表达式的值迷宫.docx(15页珍藏版)》请在冰豆网上搜索。

堆栈的应用计算数学表达式的值迷宫.docx

堆栈的应用计算数学表达式的值迷宫

堆栈的应用计算数学表达式的值、迷宫

实验四堆栈的应用

一、实验目的

掌握堆栈的使用。

二、实验内容

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空间完美搬家到新浪博客!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1