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 ...
随机推荐
- Python基础知识(2)
1:if比较运算符.and.or >=:大于或者等于 <=:小于或者等于 ==:等于 !=:不等于 (<>:也是不等于,在Python2中可用.Python3中无法使用) a ...
- Codeforces Round #319 (Div. 2)
水 A - Multiplication Table 不要想复杂,第一题就是纯暴力 代码: #include <cstdio> #include <algorithm> #in ...
- JS与JQ绑定事件的几种方式.
JS与JQ绑定事件的几种方式 JS绑定事件的三种方式 直接在DOM中进行绑定 <button onclick="alert('success')" type="bu ...
- MAX458X多通道模拟切换开关(类似74HC4051)
- ubuntu server 14.04LTS升级Python3.5
依次执行如下命令:需要root权限,普通用户可以使用sudo 来执行以下命令 root@ubuntu-server:~# add-apt-repository ppa:fkrull/deadsnake ...
- SAMBA服务初学练习
服务概述 Samba最先在Linux和Windows之间架起了一座桥梁,正是由于Samba的出现,我们可以在Linux和Windows之间实现文件共享的相互通讯,我们可以将其架设成一个功能非常强大的文 ...
- Python打开目录下所有文件
用Python打开指定目录下所有文件,统计文件里特定的字段信息. 这里是先进入2017-02-25到2017-03-03目录,然后进入特定IP段目录下,最后打开文件进行统计 import os, gl ...
- IIS6配置FastCGI遇到ERROR5的解决方法
FastCGI Error The FastCGI Handler was unable to process the request. ------------------------------- ...
- iOS面试题之内存管理
本文围绕内存管理的几种方法展开叙述. 1.内存管理是什么? 内存管理,就是对内存资源进行优化. 2.内存管理的三种方法? Objective-C的内存管理主要有三种方式ARC(自动内存计数).MRC( ...
- 【转】Java中创建对象的5种方式
Java中创建对象的5种方式 作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有 ...