C++实现顺序栈类求解中缀表达式的计算
控制台第一行打印的数值为使用形如以下方式得到的结果:
cout << +*(+)*/- << endl;
即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果作比较。
第1次测试:
第一个待求解表达式实现得出的结果比由C++表达式计算的结果大1,错误。
第2次测试:
第一个待求解表达式实现得出的结果与由C++表达式计算的结果完全一致;
第3与第5次测试:
实现无法求解取模运算;
第4次测试:
第一个待求解表达式实现得出的结果比由C++表达式计算的结果大1582,错误。
综上所述,实现用于计算一些表达式是正确可行的,而对于另外一些表达式则正确得出结果。另,由实现计算5/3*9与(5/3)*9的结果知:是否添加括号对实现能否正确计算表达式有直接关系。
图1 求解200+500*(200+300)*600/709-400与5/3*9程序运行截图
图2 求解111+56*(789+29)*5/80-400与12+5*(2+3)*6/2-4程序运行截图
图3 求解222+555*(777+111)*666/888-999/333+444+(34%7)与(5/3)*9程序运行截图
图4 求解222+555*(777+111)*666/888-999/333+444+(347)与(5/3)*9程序运行截图
图5 计算222+555*(777+111)*666/888-999/333+444+(347)与9%3程序运行截图
下面上源代码:
存储元素类型为int的顺序栈类C++描述框架:
//存储元素类型为int的顺序栈类C++描述框架:
// SeqStack1.h: interface for the SeqStack class.
//
////////////////////////////////////////////////////////////////////// #if !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
#define AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 #include "charSeqStack.h" typedef double elementType;
class SeqStack
{
public:
SeqStack();
virtual ~SeqStack();
bool stackEmpty();
bool stackFull();
bool getTop( elementType& value );
bool push( elementType value );
bool pop();
int length();
void displayStack();
int isp( elementType1 _operator );//栈内优先级
int icp( elementType1 _operator );//栈外优先级
charSeqStack css;
double doOperator( elementType value1, elementType value2, elementType1 _operator );
void calculate( char* Str ); friend ostream &operator<< (ostream &os, const SeqStack &a)
{
for (int i = ; i < a.top + ; i++)
{
if (a.top == -)
return os;
os << a.data[i];
} return os;
} private:
elementType data[maxLength];
int top;
}; #endif // !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
存储元素类型为char的顺序栈类C++描述框架:
//存储元素类型为char的顺序栈类C++描述框架:
// charSeqStack.h: interface for the charSeqStack class.
//
////////////////////////////////////////////////////////////////////// #if !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
#define AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_ #if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 typedef char elementType1;
const int maxLength = + ; class charSeqStack
{
public:
charSeqStack();
virtual ~charSeqStack();
bool stackEmpty();
bool stackFull();
bool getTop( elementType1& value );
bool push( elementType1 value );
bool pop();
int length();
int topValue();
void displayStack();
friend ostream &operator<< (ostream &os, const charSeqStack &a)
{
for (int i = ; i < a.top + ; i++)
{
if (a.top == -)
return os;
os << a.data[i];
} return os;
} private:
elementType1 data[maxLength];
int top;
}; #endif // !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
存储元素类型为int的顺序栈类C++实现:
//存储元素类型为int的顺序栈类C++实现:
// SeqStack1.cpp: implementation of the SeqStack class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "SeqStack.h" //////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// SeqStack::SeqStack()
{
top = -;
} SeqStack::~SeqStack()
{
} bool SeqStack::stackEmpty()
{
return top == -;
} bool SeqStack::stackFull()
{
return top == maxLength - ;
} bool SeqStack::getTop( elementType& value )
{
if( stackEmpty() )
{
cout << "栈空!访问栈顶元素失败!" << endl;
return false;
}
value = data[top];
return true;
} bool SeqStack::push( elementType value )
{
if( stackFull() )
{
cout << "栈满!压栈失败!" << endl;
return false;
}
top ++;
data[top] = value;
return true;
} bool SeqStack::pop()
{
if( stackEmpty() )
{
cout << "栈空!弹栈失败!" << endl;
return false;
}
top --;
return true;
} int SeqStack::length()
{
if( stackEmpty() )
{
cout << "栈空!" << endl;
return -;
}
return top + ;
} void SeqStack::displayStack()
{
if( stackEmpty() )
{
cout << "栈空!无法打印!" << endl;
return;
}
int column = ;
for( int i = ; i <= top; i ++ )
{
cout << setw() << setiosflags( ios::left ) << data[i];
column ++;
if( column % == )
cout << endl;
}
} int SeqStack::isp( char _operator )
{
switch(_operator)
{
case '#' :
return ;
break;
case '(':
return ;
break;
case '*':
return ;
break;
case '/':
return ;
break;
case '+':
return ;
break;
case '-':
return ;
break;
case ')':
return ;
break;
} cerr << "Error in SeqStack::isp" << endl;
return -;
} int SeqStack::icp( char _operator )
{
switch(_operator)
{
case '#' :
return ;
break;
case '(':
return ;
break;
case '*':
return ;
break;
case '/':
return ;
break;
case '+':
return ;
break;
case '-':
return ;
break;
case ')':
return ;
break;
} cerr << "Error in SeqStack::icp" << endl;
return -;
} double SeqStack::doOperator( elementType value1, elementType value2, elementType1 _operator )
{
switch(_operator)
{
case '+':
return value1 + value2;
break;
case '-':
return value1 - value2;
break;
case '*':
return value1 * value2;
break;
case '/':
if( fabs(value2) < 0.0001 )
{
cout << "Divided by 0!" << endl;
return -;
}
else
return value1 / value2;
break;
} cerr << "Error in SeqStack::doOperator" << endl;
return -;
} void SeqStack::calculate( char* Str )
{
charSeqStack css1;
char ch1;
int i = ;
double a, b; int level = ;
int temp = ; while ( Str[i] != '\0' )
{
i ++;
}
i = i - ;
while( css1.topValue() != - || Str[i] != '#' )
{
char ch = Str[i];
if ( isdigit(ch) )
{
temp = temp + pow( , level ) * int( ch - '' );
level ++;
i --;
}
else
{
if (level)
{
push(temp);
temp = ;
level = ;
}
css1.getTop(ch1);
if ( ch1 == ')' && ch == '(' )
{
css1.pop();
i --;
continue;
}
if ( isp(ch1) < icp(ch) )
{
css1.push(ch);
i --;
}
else if (isp(ch1) >= icp(ch))
{
getTop(a);
pop();
getTop(b);
pop();
push( doOperator( a, b, ch1 ) );
css1.pop();
}
}
} if (level)
{
push(temp);
} }
存储元素类型为char的顺序栈类C++实现:
//存储元素类型为char的顺序栈类C++实现: // charSeqStack.cpp: implementation of the charSeqStack class.
//
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "charSeqStack.h" using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// charSeqStack::charSeqStack()
{
top = -;
} charSeqStack::~charSeqStack()
{ } bool charSeqStack::stackEmpty()
{
return top == -;
} bool charSeqStack::stackFull()
{
return top == maxLength - ;
} bool charSeqStack::getTop( elementType1& value )
{
ios::sync_with_stdio(false);
if( stackEmpty() )
{
value = '#';
//cout << "栈空!访问栈顶元素失败!charSeqStack" << endl;
return false;
}
value = data[top];
return true;
} bool charSeqStack::push( elementType1 value )
{
ios::sync_with_stdio(false);
if( stackFull() )
{
cout << "栈满!压栈失败!" << endl;
return false;
}
top ++;
data[top] = value;
return true;
} bool charSeqStack::pop()
{
if( stackEmpty() )
{
cout << "栈空!弹栈失败!" << endl;
return false;
}
top --;
return true;
} int charSeqStack::length()
{
if( stackEmpty() )
{
cout << "栈空!" << endl;
return -;
}
return top + ;
} void charSeqStack::displayStack()
{
if( stackEmpty() )
{
cout << "栈空!无法打印!" << endl;
return;
}
int column = ;
for( int i = ; i <= top; i ++ )
{
cout << setw() << setiosflags( ios::left ) << data[i];
column ++;
if( column % == )
cout << endl;
}
} int charSeqStack::topValue()
{
return top;
}
C++实现顺序栈类求解中缀表达式的计算的更多相关文章
- C语言数据结构之栈:中缀表达式的计算
*注:本人技术不咋的,就是拿代码出来和大家看看,代码漏洞百出,完全没有优化,主要看气质,是吧 学了数据结构——栈,当然少不了习题.习题中最难的也是最有意思的就是这个中缀表达式的计算了(可以算+-*/和 ...
- 数据结构实验3:C++实现顺序栈类与链栈类
实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...
- Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算
中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 栈应用之中缀表达式计算 MFC实现(计算器核心)
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 支持小数.阶乘.乘方.加减乘除.括号优先级运算,美化输出结果(显示结果末尾没有多余的0) void ...
- 适用于实数范围的中缀表达式的 + - * / ( ) 计算(C++实现)
核心算法: mid=FormatMid(mid); //格式化中缀表达式 JudgeLegalMid(mid); //判断中缀表达式的合法性 MidToPost mtp(mid); mtp.ToPos ...
- 第四章 栈与队列(c4)栈应用:中缀表达式求值
- C++ 使用栈求解中缀、后缀表达式的值
1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
随机推荐
- Jamie and Interesting Graph CodeForces - 916C
http://codeforces.com/problemset/problem/916/C 好尬的题啊... #include<cstdio> #include<algorithm ...
- New Land LightOJ - 1424
New Land LightOJ - 1424 题意:找出01矩阵中最大的完全由0组成的矩阵. 方法: 重点在于转化. 先预处理(i,j)点向上最长能取到的连续的全0条的长度.然后枚举某一行作为矩阵的 ...
- 将picpick汉化及矩形截屏
- Eclipse安装svn插件的几种方式 -- 转
1.在线安装: (1).点击 Help --> Install New Software... (2).在弹出的窗口中点击add按钮,输入Name(任意)和Location(插件的URL),点击 ...
- RHEL 6.5----rsync+inotify数据同步服务
Rsync特性: 可以镜像保存整个目录树和文件系统: 可以保持原文件的权限.时间.软硬链接等: 安装简单. 传输特点: 速度快:rsync首次同步会复制同步全部内容,以后只传输修改过的文件: 压缩传输 ...
- 2019/05/13 JAVA虚拟机堆内存调优
-Xms4000m 堆内存初始值 * -Xmx4000m 堆内存最大值 * -XX:+PrintGCDetails 打印GC信息 * -XX:+UseSerialGC 使用串行GC * -XX:+Pr ...
- AS 开发环境配置
安装时不用设置代理(proxy). 建议选择标准安装,自定义安装容易选掉一些功能.插件. SDK Tools里的(HAXM installer)有时会未安装,安装完需检查(HAXM installer ...
- #error和#line使用分析
#error的用法 #error用于生成一个编译错误消息 用法:error message(不需要用双引号包围) #error编译指示字用于自定义程序员特有的编译错误,消息类似的 #warning用于 ...
- 通过HTML 取得页面、屏幕、浏览器的高度宽度
一.介绍 1. 容器 一个页面的展示,从外到内的容器为:屏幕.浏览器以及页面本身. HTML元素展现在页面内,页面展现在浏览器内,而浏览器展现在屏幕内. 通过Js的一些对象可以获取这些容器的高度.宽度 ...
- python中的get函数
>>> a={1:'a',2:'b'}>>> print a.get(1)a>>> print a.get(3)None