堆栈的应用计算数学表达式的值、迷宫
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);