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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

实验四堆栈的应用

一、实验目的

掌握堆栈的使用。

二、实验内容

1、计算数学表达式的值。

输入数学表达式,输出表达式的计算结果。数学表达式由单个数字和运算符"+"、"-"、"*"、"/"、"(、")构成,例如2+3*(4+5)– 6/4。假定表达式输入格式合法。

*2、以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

迷宫根据一个迷宫数据文件建立。迷宫数据文件由一个包含0、1的矩阵组成。迷宫的通路可以使用通路上各点的坐标序列进行展示(使用图形展示最佳)。

*计算数学表达式的值*

*在此没先转成后缀表达式,代码写得不好*

#pragma once

#include"NoMem.h"

#include"OutOfBounds.h"

template class T

class Stack

{

public:

Stack(int MaxStackSize=10);

~Stack(){delete stack;}

bool IsEmpty()const{return top==-1;}

bool IsFull()const{return top==MaxTop;} T Top()const;

Stack T&Add(const T&x);

Stack T&Delete(T&x);

private:

int top;

int MaxTop;

T*stack;

};

template class T

Stack T:Stack(int MaxStackSize)

{

MaxTop=MaxStackSize-1;

stack=new T[MaxStackSize];

top=-1;

}

template class T

T Stack T:Top()const

{

if(IsEmpty())throw OutOfBounds();

else return stack[top];

}

template class T

Stack T&Stack T:Add(const T&x)

{

if(IsFull())throw NoMem();

stack[++top]=x;

return*this;

}

template class T

Stack T&Stack T:Delete(T&x)

{

if(IsEmpty())throw OutOfBounds();

x=stack[top--];

return*this;

}

*

#pragma once class OutOfBounds

{

public:

OutOfBounds(void){}

~OutOfBounds(void){}

};

*

#pragma once class NoMem

{

public:

NoMem(void){}

~NoMem(void){}

};

*

//exp4计算数学表达式的值.cpp:定义控制台应用程序的入口点。//

#include"stdafx.h"

#include string

#include"Stack.h"

#include iostream using namespace std;

const int MaxLength=100;

float count(const char*expr)

{

Stack char sign(MaxLength);

Stack float data(MaxLength);

sign.Add('#');

float j,k;

char temp;

int length=strlen(expr);

for(int i=0;i length;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();

}

else if(sign.Top()=='*')//符号栈的顶部为'*'

{

data.Delete(j);

j=j*((float)expr[i]-48);

//cout"dataj:"j endl;

data.Add(j);

sign.Delete(temp);

//cout sign.Top();

}

else//符号栈的顶部为'/'

{

data.Delete(j);

j=j/((float)expr[i]-48);

data.Add(j);

sign.Delete(temp);

}

}

else if(expr[i]=='('||expr[i]=='*'||expr[i]=='/'){ sign.Add(expr[i]);

//cout"aaa:"sign.Top();

}

else if(expr[i]=='+'||expr[i]=='-')

{

if(sign.Top()!='+'&&sign.Top()!='-')

{

sign.Add(expr[i]);

//cout"sign+:"sign.Top();

}

else if(sign.Top()=='+')

{

data.Delete(j);

data.Delete(k);

相关文档
最新文档