zoukankan      html  css  js  c++  java
  • C++实现顺序栈类求解中缀表达式的计算

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

    1   cout << 200+500*(200+300)*600/709-400 << 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++描述框架:

     1 //存储元素类型为int的顺序栈类C++描述框架:
     2 // SeqStack1.h: interface for the SeqStack class.
     3 //
     4 //////////////////////////////////////////////////////////////////////
     5  
     6 #if !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
     7 #define AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_
     8  
     9 #if _MSC_VER > 1000
    10 #pragma once
    11 #endif // _MSC_VER > 1000
    12  
    13 #include "charSeqStack.h"
    14  
    15 typedef double elementType;
    16 class SeqStack  
    17 {
    18 public:
    19     SeqStack();
    20     virtual ~SeqStack();
    21     bool stackEmpty();
    22     bool stackFull();
    23     bool getTop( elementType& value );
    24     bool push( elementType value );
    25     bool pop();
    26     int length();
    27     void displayStack();
    28     int isp( elementType1 _operator );//栈内优先级
    29     int icp( elementType1 _operator );//栈外优先级
    30     charSeqStack css;
    31     double doOperator( elementType value1, elementType value2, elementType1 _operator );
    32     void calculate( char* Str );
    33     
    34     friend ostream &operator<< (ostream &os, const SeqStack &a)
    35     {
    36         for (int i = 0; i < a.top + 1; i++)
    37         {
    38             if (a.top == -1)
    39                 return os;
    40             os << a.data[i];
    41         }
    42  
    43         return os;
    44     }
    45     
    46 private:
    47     elementType data[maxLength];
    48     int top;
    49 };
    50  
    51 #endif // !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)

           存储元素类型为char的顺序栈类C++描述框架:

     1 //存储元素类型为char的顺序栈类C++描述框架:
     2 // charSeqStack.h: interface for the charSeqStack class.
     3 //
     4 //////////////////////////////////////////////////////////////////////
     5  
     6 #if !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
     7 #define AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_
     8  
     9 #if _MSC_VER > 1000
    10 #pragma once
    11 #endif // _MSC_VER > 1000
    12  
    13 typedef char elementType1;
    14 const int maxLength = 1000 + 13;
    15  
    16 class charSeqStack  
    17 {
    18 public:
    19     charSeqStack();
    20     virtual ~charSeqStack();
    21     bool stackEmpty();
    22     bool stackFull();
    23     bool getTop( elementType1& value );
    24     bool push( elementType1 value );
    25     bool pop();
    26     int length();
    27     int topValue();
    28     void displayStack();
    29     friend ostream &operator<< (ostream &os, const charSeqStack &a)
    30     {
    31         for (int i = 0; i < a.top + 1; i++)
    32         {
    33             if (a.top == -1)
    34                 return os;
    35             os << a.data[i];
    36         }
    37  
    38         return os;
    39     }
    40  
    41 private:
    42     elementType1 data[maxLength];
    43     int top;
    44 };
    45  
    46  
    47 #endif // !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)

           存储元素类型为int的顺序栈类C++实现:

      1 //存储元素类型为int的顺序栈类C++实现:
      2 // SeqStack1.cpp: implementation of the SeqStack class.
      3 //
      4 //////////////////////////////////////////////////////////////////////
      5  
      6 #include "stdafx.h"
      7 #include "SeqStack.h"
      8  
      9  
     10 //////////////////////////////////////////////////////////////////////
     11 // Construction/Destruction
     12 //////////////////////////////////////////////////////////////////////
     13  
     14 SeqStack::SeqStack()
     15 {
     16     top = -1;
     17 }
     18  
     19 SeqStack::~SeqStack()
     20 {    
     21 }
     22  
     23 bool SeqStack::stackEmpty()
     24 {
     25     return top == -1;
     26 }
     27  
     28 bool SeqStack::stackFull()
     29 {
     30     return top == maxLength - 1;
     31 }
     32  
     33 bool SeqStack::getTop( elementType& value )
     34 {
     35     if( stackEmpty() )
     36     {
     37         cout << "栈空!访问栈顶元素失败!" << endl;
     38         return false;
     39     }
     40     value = data[top];
     41     return true;
     42 }
     43  
     44 bool SeqStack::push( elementType value )
     45 {
     46     if( stackFull() )
     47     {
     48         cout << "栈满!压栈失败!" << endl;
     49         return false;
     50     }
     51     top ++;
     52     data[top] = value;
     53     return true;
     54 }
     55  
     56 bool SeqStack::pop()
     57 {
     58     if( stackEmpty() )
     59     {
     60         cout << "栈空!弹栈失败!" << endl;
     61         return false;
     62     }
     63     top --;
     64     return true;
     65 }
     66  
     67 int SeqStack::length()
     68 {
     69     if( stackEmpty() )
     70     {
     71         cout << "栈空!" << endl;
     72         return -1;
     73     }
     74     return top + 1;
     75 }
     76  
     77 void SeqStack::displayStack()
     78 {
     79     if( stackEmpty() )
     80     {
     81         cout << "栈空!无法打印!" << endl;
     82         return;
     83     }
     84     int column = 0;
     85     for( int i = 0; i <= top; i ++ )
     86     {
     87         cout << setw(6) << setiosflags( ios::left ) << data[i];
     88         column ++;
     89         if( column % 10 == 0 )
     90             cout << endl;
     91     }
     92 }
     93  
     94 int SeqStack::isp( char _operator )
     95 {
     96     switch(_operator)
     97     {
     98     case '#' :
     99         return 0;
    100         break;
    101     case '(':
    102         return 6;
    103         break;
    104     case '*':
    105         return 5;
    106         break;
    107     case '/':
    108         return 5;
    109         break;
    110     case '+':
    111         return 3;
    112         break;
    113     case '-':
    114         return 3;
    115         break;
    116     case ')':
    117         return 1;
    118         break;
    119     }
    120  
    121     cerr << "Error in SeqStack::isp" << endl;
    122     return -1;
    123 }
    124  
    125 int SeqStack::icp( char _operator )
    126 {
    127     switch(_operator)
    128     {
    129     case '#' :
    130         return 0;
    131         break;
    132     case '(':
    133         return 1;
    134         break;
    135     case '*':
    136         return 4;
    137         break;
    138     case '/':
    139         return 4;
    140         break;
    141     case '+':
    142         return 2;
    143         break;
    144     case '-':
    145         return 2;
    146         break;
    147     case ')':
    148         return 6;
    149         break;
    150     }
    151  
    152     cerr << "Error in SeqStack::icp" << endl;
    153     return -1;
    154 }
    155  
    156 double SeqStack::doOperator( elementType value1, elementType value2, elementType1 _operator )
    157 {
    158     switch(_operator)
    159     {
    160     case '+':
    161         return value1 + value2;
    162         break;
    163     case '-':
    164         return value1 - value2;
    165         break;
    166     case '*':
    167         return value1 * value2;
    168         break;
    169     case '/':
    170         if( fabs(value2) < 0.0001 )
    171         {
    172             cout << "Divided by 0!" << endl;
    173             return -1000000;
    174         }
    175         else
    176             return value1 / value2;
    177         break;
    178     }
    179  
    180     cerr << "Error in SeqStack::doOperator" << endl;
    181     return -1;
    182 }
    183  
    184 void SeqStack::calculate( char* Str )
    185 {
    186     charSeqStack css1;
    187     char ch1;
    188     int i = 0;
    189     double a, b;
    190     
    191     int level = 0;
    192     int temp = 0;
    193  
    194     while ( Str[i] != '' )
    195     {
    196         i ++;
    197     }
    198     i = i - 2;
    199     while( css1.topValue() != -1 || Str[i] != '#' )
    200     {
    201         char ch = Str[i];
    202         if ( isdigit(ch) )
    203         {
    204             temp = temp + pow( 10, level ) * int( ch - '0' );
    205             level ++;
    206             i --;
    207         }
    208         else
    209         {
    210             if (level)
    211             {
    212                 push(temp);
    213                 temp = 0;
    214                 level = 0;
    215             }
    216             css1.getTop(ch1);
    217             if ( ch1 == ')' && ch == '(' )
    218             {
    219                 css1.pop();
    220                 i --;
    221                 continue;
    222             }
    223             if ( isp(ch1) < icp(ch) )
    224             {
    225                 css1.push(ch);
    226                 i --;
    227             }
    228             else if (isp(ch1) >= icp(ch))
    229             {
    230                 getTop(a);
    231                 pop();
    232                 getTop(b);
    233                 pop();
    234                 push( doOperator( a, b, ch1 ) );
    235                 css1.pop();
    236             }
    237         }
    238     }
    239  
    240     if (level)
    241     {
    242         push(temp);
    243     }
    244      
    245 }

    存储元素类型为char的顺序栈类C++实现:

      1 //存储元素类型为char的顺序栈类C++实现:
      2  
      3 // charSeqStack.cpp: implementation of the charSeqStack class.
      4 //
      5 //////////////////////////////////////////////////////////////////////
      6  
      7 #include "stdafx.h"
      8 #include "charSeqStack.h"
      9  
     10  
     11 using namespace std;
     12 //////////////////////////////////////////////////////////////////////
     13 // Construction/Destruction
     14 //////////////////////////////////////////////////////////////////////
     15  
     16 charSeqStack::charSeqStack()
     17 {
     18     top = -1;
     19 }
     20  
     21 charSeqStack::~charSeqStack()
     22 {
     23  
     24 }
     25  
     26 bool charSeqStack::stackEmpty()
     27 {
     28     return top == -1;
     29 }
     30  
     31 bool charSeqStack::stackFull()
     32 {
     33     return top == maxLength - 1;
     34 }
     35  
     36 bool charSeqStack::getTop( elementType1& value )
     37 {
     38     ios::sync_with_stdio(false);
     39     if( stackEmpty() )
     40     {
     41         value = '#';
     42         //cout << "栈空!访问栈顶元素失败!charSeqStack" << endl;
     43         return false;
     44     }
     45     value = data[top];
     46     return true;
     47 }
     48  
     49 bool charSeqStack::push( elementType1 value )
     50 {
     51     ios::sync_with_stdio(false);
     52     if( stackFull() )
     53     {
     54         cout << "栈满!压栈失败!" << endl;
     55         return false;
     56     }
     57     top ++;
     58     data[top] = value;
     59     return true;
     60 }
     61  
     62 bool charSeqStack::pop()
     63 {
     64     if( stackEmpty() )
     65     {
     66         cout << "栈空!弹栈失败!" << endl;
     67         return false;
     68     }
     69     top --;
     70     return true;
     71 }
     72  
     73 int charSeqStack::length()
     74 {
     75     if( stackEmpty() )
     76     {
     77         cout << "栈空!" << endl;
     78         return -1;
     79     }
     80     return top + 1;
     81 }
     82  
     83 void charSeqStack::displayStack()
     84 {
     85     if( stackEmpty() )
     86     {
     87         cout << "栈空!无法打印!" << endl;
     88         return;
     89     }
     90     int column = 0;
     91     for( int i = 0; i <= top; i ++ )
     92     {
     93         cout << setw(6) << setiosflags( ios::left ) << data[i];
     94         column ++;
     95         if( column % 10 == 0 )
     96             cout << endl;
     97     }
     98 }
     99  
    100 int charSeqStack::topValue()
    101 {
    102     return top;
    103 }
  • 相关阅读:
    二十一.组合模式
    二十四.桥接模式
    二十六.职责链模式
    二十五.命令模式
    将小写转化成大写
    备份JOB SCHEDULE ENTRY的简单方法
    如何确定哪一个作业锁定QDLS下的一个目标
    WRKACTJOB命令一些有用功能介绍
    如何使用CA/400批处理的方式传输数据
    用前缀给字段命名
  • 原文地址:https://www.cnblogs.com/25th-engineer/p/9859887.html
Copyright © 2011-2022 走看看