控制台第一行打印的数值为使用形如以下方式得到的结果:

   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++实现顺序栈类求解中缀表达式的计算的更多相关文章

  1. C语言数据结构之栈:中缀表达式的计算

    *注:本人技术不咋的,就是拿代码出来和大家看看,代码漏洞百出,完全没有优化,主要看气质,是吧 学了数据结构——栈,当然少不了习题.习题中最难的也是最有意思的就是这个中缀表达式的计算了(可以算+-*/和 ...

  2. 数据结构实验3:C++实现顺序栈类与链栈类

      实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...

  3. Python与数据结构[1] -> 栈/Stack[1] -> 中缀表达式与后缀表达式的转换和计算

    中缀表达式与后缀表达式的转换和计算 目录 中缀表达式转换为后缀表达式 后缀表达式的计算 1 中缀表达式转换为后缀表达式 中缀表达式转换为后缀表达式的实现方式为: 依次获取中缀表达式的元素, 若元素为操 ...

  4. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  5. 栈应用之中缀表达式计算 MFC实现(计算器核心)

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 支持小数.阶乘.乘方.加减乘除.括号优先级运算,美化输出结果(显示结果末尾没有多余的0) void ...

  6. 适用于实数范围的中缀表达式的 + - * / ( ) 计算(C++实现)

    核心算法: mid=FormatMid(mid); //格式化中缀表达式 JudgeLegalMid(mid); //判断中缀表达式的合法性 MidToPost mtp(mid); mtp.ToPos ...

  7. 第四章 栈与队列(c4)栈应用:中缀表达式求值

  8. C++ 使用栈求解中缀、后缀表达式的值

    1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...

  9. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

随机推荐

  1. websocket实现群聊

    server # @File: 群聊 from flask import Flask, render_template, request from geventwebsocket.handler im ...

  2. HDFS Java API

    HDFS Java API 搭建Hadoop客户端与Java访问HDFS集群

  3. 【数据结构(C语言版)系列四】 串

    串类型的定义 串(或字符串)是由零个或多个字符组成的有限序列,一般记为 s = 'a1a2...an',s为串名.子串在主串中的位置以子串的第一个字符在主串中的位置来表示. 串和表示和实现——定长顺序 ...

  4. 482 License Key Formatting 注册码格式化

    详见:https://leetcode.com/problems/license-key-formatting/description/ C++: class Solution { public: s ...

  5. new几种用法

    在 C# 中,new 关键字可用作运算符.修饰符或约束. new 运算符 用于创建对象和调用构造函数. new 修饰符 用于向基类成员隐藏继承成员. new 约束 用于在泛型声明中约束可能用作类型参数 ...

  6. Dev GridView 属性说明

    说明  Options  OptionsBehavior 视图的行为选项 AllowIncrementalSearch 允许用户通过输入想得到的列值来定位行 AllowPartialRedrawOnS ...

  7. python的与或非运算

    真的很重要,栽了个跟头!!!(虽然以前好像知道...) print(True or False and False) print((True or False) and False) # True # ...

  8. CSS层叠的问题、标准文档流、伪类选择器

    一.层叠的问题 CSS有两个性质: 1.继承性 2.层叠性:选择器的一种选择能力,谁的权重大就选谁 层叠性又分为: 1).选不中:走继承性  (font.color.text.) 继承性的权重是0 若 ...

  9. iOS 创建xcode插件

    苹果的"一个足以应付所有"策略使得它的产品越来越像一个难以下咽的药丸.尽管苹果已经将一些工作流带给了iOS/OS X的开发者,我们仍然希望通过插件来使得Xcode更加顺手! 虽然苹 ...

  10. [Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .

    递归优化 很多算法都依赖于递归,典型的比如分治法(Divide-and-Conquer).但是普通的递归算法在处理规模较大的问题时,常常会出现StackOverflowError.处理这个问题,我们可 ...