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 ...
随机推荐
- websocket实现群聊
server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...
- HDFS Java API
HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群
- 【数据结构(C语言版)系列四】 串
串类型的定义 串(或字符串)是由零个或多个字符组成的有限序列,一般记为 s = 'a1a2...an',s为串名.子串在主串中的位置以子串的第一个字符在主串中的位置来表示. 串和表示和实现——定长顺序 ...
- 482 License Key Formatting 注册码格式化
详见:https://leetcode.com/problems/license-key-formatting/description/ C++: class Solution { public: s ...
- new几种用法
在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...
- Dev GridView 属性说明
说明 Options OptionsBehavior 视图的行为选项 AllowIncrementalSearch 允许用户通过输入想得到的列值来定位行 AllowPartialRedrawOnS ...
- python的与或非运算
真的很重要,栽了个跟头!!!(虽然以前好像知道...) print(True or False and False) print((True or False) and False) # True # ...
- CSS层叠的问题、标准文档流、伪类选择器
一.层叠的问题 CSS有两个性质: 1.继承性 2.层叠性:选择器的一种选择能力,谁的权重大就选谁 层叠性又分为: 1).选不中:走继承性 (font.color.text.) 继承性的权重是0 若 ...
- iOS 创建xcode插件
苹果的"一个足以应付所有"策略使得它的产品越来越像一个难以下咽的药丸.尽管苹果已经将一些工作流带给了iOS/OS X的开发者,我们仍然希望通过插件来使得Xcode更加顺手! 虽然苹 ...
- [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...