zoukankan      html  css  js  c++  java
  • 数据结构实验3:C++实现顺序栈类与链栈类

                                                                                              实验3 
    3.1 实验目的

    熟练掌握栈的顺序存储结构和链式存储结构。

    熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现。

    根据具体给定的需求,合理设计并实现相关结构和算法。
    3.2实验要求
    3.2.1 顺序栈的实验要求

    顺序栈结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

    实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

    程序有适当的注释。
    3.2.2 链栈实验要求

    本次实验中的链栈结构指带头结点的单链表;

    链栈结构和运算定义,算法的实现以库文件方式实现,不得在测试主程序中直接实现;

    实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求;

    程序有适当的注释。
    3.3 实验任务
    3.3.1 顺序栈实验任务

    设计并实现一个顺序栈,编写算法实现下列问题的求解。

    <1>利用顺序栈实现将10进制数转换为16进制数。

    第一组数据:4 / 4

    第二组数据:11 / B

    第三组数据:254 / FE

    第四组数据:1357 / 54D

    <2>对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
    3.3.2 链栈实验任务

    以带头结点的单链表表示链栈,编写算法实现下列问题的求解。

    <1>利用顺序栈实现将10进制数转换为16进制数。

    第一组数据:4

    第二组数据:11

    第三组数据:254

    第四组数据:1357

    <2>对一个合法的数学表达式来说,其中的各大小括号“{”,“}”,“[”,“]”,“(”和“)”应是相互匹配的。设计算法对以字符串形式读入的表达式S,判断其中的各括号是否是匹配的。
    3.4 选做题

    非必做内容,有兴趣的同学选做。自行选择栈的存储结构。

    <1>假设栈的输入序列为1、2、3、...、n,设计算法实现对给定的一个序列,判定其是否是此栈合法的输出序列。

    <2>假设栈的输入序列为1、2、3、...、n,设计算法求出所有可能的出栈序列。

    <3>利用栈求解算术表达式的值。
    3.5 运行结果截图及说明

    图1 顺序栈实现十进制转十六进制

     

    图2 顺序栈解决表达式括号匹配问题(局部)

     

    图3 顺序栈解决表达式括号匹配问题(局部)

     

    图4 顺序栈解决表达式括号匹配问题(局部)

     

    图5 顺序栈解决表达式括号匹配问题(局部)

     

    图6 链栈实现十进制转十六进制

     

    图7 链栈解决表达式括号匹配问题(局部)

     

    图8 链栈解决表达式括号匹配问题(局部)

     

    图9 链栈解决表达式括号匹配问题(局部)

     

    图10 链栈解决表达式括号匹配问题(局部)

     

    图11 链栈判断1、2、3、4排列中合法出栈序列的问题

     

    图12 链栈解决输出1、2、3、4、5、6、7全排列中合法出栈序列的问题(放大可清晰观看)

     

    图13 链栈中缀表达式求值问题

     

    3.6 附源代码

    顺序栈代码:

     1 // stdafx.h : include file for standard system include files,
     2 //  or project specific include files that are used frequently, but
     3 //      are changed infrequently
     4 //
     5 
     6 #if !defined(AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_)
     7 #define AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_
     8 
     9 #if _MSC_VER > 1000
    10 #pragma once
    11 #endif // _MSC_VER > 1000
    12 
    13 #include <stdc++.h>
    14 
    15 using namespace std;
    16 
    17 //typedef int elementType;
    18 typedef double elementType;
    19 typedef char elementType1;
    20 const int maxLength = 1000 + 3;
    21 
    22 // TODO: reference additional headers your program requires here
    23 
    24 //{{AFX_INSERT_LOCATION}}
    25 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    26 
    27 #endif // !defined(AFX_STDAFX_H__F1CE48FC_1D41_45D9_B60D_6D065D91DB10__INCLUDED_)

     

     1 // SeqStack1.h: interface for the SeqStack class.
     2 //
     3 //////////////////////////////////////////////////////////////////////
     4 
     5 #if !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
     6 #define AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_
     7 
     8 #if _MSC_VER > 1000
     9 #pragma once
    10 #endif // _MSC_VER > 1000
    11 
    12 #include "charSeqStack.h"
    13 
    14 //using elementType = double;
    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( charSeqStack& css1, charSeqStack& css2 );
    33     friend ostream &operator<< (ostream &os, const SeqStack &a)
    34     {
    35         for (int i = 0; i < a.top + 1; i++)
    36         {
    37             if (a.top == -1)
    38                 return os;
    39             os << a.data[i];
    40         }
    41 
    42         return os;
    43     }
    44 
    45 private:
    46     elementType data[maxLength];
    47     int top;
    48 };
    49 
    50 #endif // !defined(AFX_SEQSTACK1_H__55EE245C_A5F8_47D4_9510_B3BA6C85FF63__INCLUDED_)
      1 // SeqStack1.cpp: implementation of the SeqStack class.
      2 //
      3 //////////////////////////////////////////////////////////////////////
      4 
      5 #include "stdafx.h"
      6 #include "SeqStack1.h"
      7 #include <iostream>
      8 #include <iomanip>
      9 
     10 //////////////////////////////////////////////////////////////////////
     11 // Construction/Destruction
     12 //////////////////////////////////////////////////////////////////////
     13 using namespace std;
     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( charSeqStack& css1, charSeqStack& css2 )//?????? css2 ?им????????? css1 ?
    185 {
    186     char ch, ch1;
    187     int i = 0, j = 0;
    188     double a, b;
    189     css2.pop();
    190     css2.getTop(ch);
    191     css2.pop();
    192     
    193     // when the top of css2 is not '#' or the top of css is not empty.
    194     while( css1.topValue() != -1 || ch != '#' )
    195     {
    196         // when the top of css2 is a number, put it into ss1
    197         if( isdigit(ch) )
    198         {
    199             push( (int)( ch - '0' ) );
    200             css2.getTop(ch);
    201             css2.pop();
    202         }
    203 
    204         // when the top of css2 is not a number,
    205         else
    206         {
    207             css1.getTop(ch1);
    208             if (ch1 == ')' && ch == '(')
    209             {
    210                 css1.pop();
    211                 css2.getTop(ch);
    212                 css2.pop();
    213                 continue;
    214             }
    215             if( isp(ch1) < icp(ch) )
    216             {
    217                 css1.push(ch);
    218                 css2.getTop(ch);
    219                 css2.pop();
    220             }
    221             else if( isp(ch1) >= icp(ch) )
    222             {
    223                 getTop(a);
    224                 pop();
    225                 getTop(b);
    226                 pop();
    227                 push( doOperator( a, b, ch1 ) );
    228                 css1.pop();
    229             }            
    230         }
    231 
    232     }
    233      
    234 }
     1 // charSeqStack.h: interface for the charSeqStack class.
     2 //
     3 //////////////////////////////////////////////////////////////////////
     4 
     5 #if !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
     6 #define AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_
     7 
     8 #if _MSC_VER > 1000
     9 #pragma once
    10 #endif // _MSC_VER > 1000
    11 
    12 #include <iostream>
    13 using namespace std;
    14 //using elementType1 = char;
    15 typedef char elementType1;
    16 //const int maxLength = 1000;
    17 
    18 class charSeqStack  
    19 {
    20 public:
    21     charSeqStack();
    22     virtual ~charSeqStack();
    23     bool stackEmpty();
    24     bool stackFull();
    25     bool getTop( elementType1& value );
    26     bool push( elementType1 value );
    27     bool pop();
    28     int length();
    29     int topValue();
    30     void displayStack();
    31     friend ostream &operator<< (ostream &os, const charSeqStack &a)
    32     {
    33         for (int i = 0; i < a.top+2; i++)
    34         {
    35             if (a.top == -1)
    36                 return os;
    37             os << a.data[i];
    38         }
    39 
    40         return os;
    41     }
    42 
    43 private:
    44     elementType1 data[maxLength];
    45     int top;
    46 };
    47 
    48 
    49 #endif // !defined(AFX_CHARSEQSTACK_H__A9958AD3_333A_41B4_B399_B6895C7AA8C5__INCLUDED_)
      1 // charSeqStack.cpp: implementation of the charSeqStack class.
      2 //
      3 //////////////////////////////////////////////////////////////////////
      4 
      5 #include "stdafx.h"
      6 #include "charSeqStack.h"
      7 #include <iostream>
      8 #include <iomanip>
      9 
     10 using namespace std;
     11 //////////////////////////////////////////////////////////////////////
     12 // Construction/Destruction
     13 //////////////////////////////////////////////////////////////////////
     14 
     15 charSeqStack::charSeqStack()
     16 {
     17     top = -1;
     18 }
     19 
     20 charSeqStack::~charSeqStack()
     21 {
     22 
     23 }
     24 
     25 bool charSeqStack::stackEmpty()
     26 {
     27     return top == -1;
     28 }
     29 
     30 bool charSeqStack::stackFull()
     31 {
     32     return top == maxLength - 1;
     33 }
     34 
     35 bool charSeqStack::getTop( elementType1& value )
     36 {
     37     if( stackEmpty() )
     38     {
     39         value = '#';
     40         cout << "???ив????????ив" << endl;
     41         return false;
     42     }
     43     value = data[top];
     44     return true;
     45 }
     46 
     47 bool charSeqStack::push( elementType1 value )
     48 {
     49     if( stackFull() )
     50     {
     51         cout << "?и▓ив????ив" << endl;
     52         return false;
     53     }
     54     top ++;
     55     data[top] = value;
     56     return true;
     57 }
     58 
     59 bool charSeqStack::pop()
     60 {
     61     if( stackEmpty() )
     62     {
     63         cout << "??ив????ив" << endl;
     64         return false;
     65     }
     66     top --;
     67     return true;
     68 }
     69 
     70 int charSeqStack::length()
     71 {
     72     if( stackEmpty() )
     73     {
     74         cout << "??ив" << endl;
     75         return -1;
     76     }
     77     return top + 1;
     78 }
     79 
     80 void charSeqStack::displayStack()
     81 {
     82     if( stackEmpty() )
     83     {
     84         cout << "??ив????ив" << endl;
     85         return;
     86     }
     87     int column = 0;
     88     for( int i = 0; i <= top; i ++ )
     89     {
     90         cout << setw(6) << setiosflags( ios::left ) << data[i];
     91         column ++;
     92         if( column % 10 == 0 )
     93             cout << endl;
     94     }
     95 }
     96 
     97 int charSeqStack::topValue()
     98 {
     99     return top;
    100 }
     1 // SeqStack.cpp : Defines the entry point for the console application.
     2 //
     3 
     4 #include "stdafx.h"
     5 #include "SeqStack1.h"
     6 #include <iostream>
     7 
     8 using namespace std;
     9 int main(int argc, char* argv[])
    10 {
    11     SeqStack ss1;
    12     ss1.push(0);
    13     charSeqStack css1, css2;
    14     char Str[] = "#2+5*(2+3)*6/2-4#";
    15     //12+5*(2+3)*6/2-4
    16     //char Str[] = "#(1+(5-3)*2+9)/2#";
    17     //char Str[] = "#(1+2)*3#";
    18     //char Str[] = "#(1)#";
    19     //char Str[] = "#1*2+3#";
    20     //char Str[] = "#1+1#";
    21     //char Str[] = "#1#";
    22     for( int i = 0; Str[i] != ''; i ++ )
    23         css2.push( Str[i] );
    24 
    25     cout << "Start Calculation." << endl;
    26     cout << "expression:" << css2 << endl;
    27     ss1.calculate( css1, css2 );
    28     cout << "Calculation Done!" << endl;
    29 
    30     double x;
    31     if( ss1.getTop(x) )
    32         cout << x << endl;
    33     cin.get();
    34     return 0;
    35 }

    链栈代码:

     1 // stdafx.h : include file for standard system include files,
     2 //  or project specific include files that are used frequently, but
     3 //      are changed infrequently
     4 //
     5 
     6 #if !defined(AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_)
     7 #define AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_
     8 
     9 #if _MSC_VER > 1000
    10 #pragma once
    11 #endif // _MSC_VER > 1000
    12 
    13 #include <stdc++.h>
    14 
    15 using namespace std;
    16 
    17 typedef double elementType;
    18 typedef char elementType1;
    19 
    20 typedef struct node
    21 {
    22     elementType data;
    23     struct node *link;
    24 }LStack, *PStack;
    25 
    26 typedef struct Node
    27 {
    28     elementType1 data;
    29     struct Node *link;
    30 }CLStack, *CPStack;
    31 
    32 typedef long ll;
    33 
    34 // TODO: reference additional headers your program requires here
    35 
    36 //{{AFX_INSERT_LOCATION}}
    37 // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    38 
    39 #endif // !defined(AFX_STDAFX_H__2FE69ABE_CC01_4962_8147_FD6E39302FE4__INCLUDED_)
     1 // linkedStack.h: interface for the linkedStack class.
     2 //
     3 //////////////////////////////////////////////////////////////////////
     4 
     5 #if !defined(AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_)
     6 #define AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_
     7 
     8 #if _MSC_VER > 1000
     9 #pragma once
    10 #endif // _MSC_VER > 1000
    11 
    12 #include "charLinkedStack.h"
    13 
    14 class linkedStack  
    15 {
    16 public:
    17     linkedStack();
    18     virtual ~linkedStack();
    19     bool stackEmpty();
    20     //bool stackFull();
    21     bool getTop( elementType& value );
    22     bool push( elementType value );
    23     bool pop();
    24     int length();
    25     void displayStack();
    26     int isp( char  _operator );//栈内优先级
    27     int icp( char _operator );//栈外优先级
    28     double doOperator( elementType value1, elementType value2, char _operator );
    29     void calculate( char* Str );
    30     charLinkedStack cls;
    31     bool isPopOrder();
    32     bool judge(const elementType *sour, int s1, const elementType *dest, int s2 );
    33     void linkedStack::printValidPopStackSequence( int n, elementType *A, int cur );
    34     friend ostream &operator<< ( ostream &os, const linkedStack &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         LStack *tmp = a.top;
    43         int column = 0;
    44         while( tmp->link )
    45         {
    46             //cout << tmp->data << " ";
    47             if( tmp->link == NULL )
    48                 return os;
    49                 //break;
    50             //os << tmp->data << " ";
    51             os << setw(7) << setiosflags(ios::left) << tmp->data << " ";
    52             column ++;
    53             if( column % 10 == 0 )
    54                 os << setw(7) << setiosflags(ios::left) << endl;
    55             tmp = tmp->link;
    56         }
    57         os << endl;
    58 
    59         return os;
    60     }
    61 private:
    62     LStack *top;
    63     int len;
    64 };
    65 
    66 #endif // !defined(AFX_LINKEDSTACK_H__54B665DE_2CE8_4329_AED9_95FEAAAAE128__INCLUDED_)
      1 // linkedStack.cpp: implementation of the linkedStack class.
      2 //
      3 //////////////////////////////////////////////////////////////////////
      4 
      5 #include "stdafx.h"
      6 #include "linkedStack.h"
      7 
      8 //////////////////////////////////////////////////////////////////////
      9 // Construction/Destruction
     10 //////////////////////////////////////////////////////////////////////
     11 
     12 linkedStack::linkedStack()
     13 {
     14     top = new LStack;
     15     if( !top )
     16     {
     17         cerr << "Space allocating falied!Error in linkedStack::linkedStack()!" << endl;
     18     }
     19     top->link = NULL;
     20     //top = NULL;
     21     len = 0;
     22 }
     23 
     24 linkedStack::~linkedStack()
     25 {
     26     /*
     27     LStack *tmp = top;
     28     while( tmp->link )
     29     {
     30         LStack *q = tmp;
     31 
     32         tmp = tmp->link;
     33         delete q;
     34         
     35         len --;
     36     }    
     37     tmp->link = NULL;
     38     */
     39     while(top)
     40     {
     41         LStack *q = top;
     42         top = top->link;
     43         delete q;
     44     }
     45     top = NULL;
     46 }
     47 
     48 bool linkedStack::stackEmpty()
     49 {
     50     //follow style is not suitable for the code
     51     //return top == NULL;
     52     return top->link == NULL;
     53 }
     54 
     55 bool linkedStack::getTop( elementType& value )
     56 {
     57     if( stackEmpty() )
     58     {
     59         cerr << "Stack is Empty!Error in linkedStack::getTop!" << endl;
     60         //value = -1;
     61         return false;
     62     }
     63     value = top->data;
     64     return false;
     65 }
     66 
     67 bool linkedStack::push( elementType value )
     68 {
     69     LStack *newNode = new LStack;
     70     if( !newNode )
     71     {
     72         cerr << "Space allocating falied!" << endl;
     73         return false;
     74     }
     75     newNode->data = value;
     76     newNode->link = top;
     77     top = newNode;
     78     len ++;
     79     return true;
     80 }
     81 
     82 bool linkedStack::pop()
     83 {
     84     if( stackEmpty() )
     85     {
     86         cerr << "Stack is empty!Error in linkedStack::pop()!" << endl;
     87         return false;
     88     }
     89     LStack *tmp = top;
     90     
     91     top = top->link;
     92     delete tmp;
     93     len --;
     94     return true;
     95 }
     96 
     97 int linkedStack::length()
     98 {
     99     if( stackEmpty() )
    100     {
    101         cerr << "Stack is empty!Error in linkedStack::length()" << endl;
    102         return -1;
    103     }
    104     int cnt = 0;
    105     LStack *tmp = top;
    106     while( tmp->link )
    107     {
    108         tmp = tmp->link;
    109         cnt ++;
    110     }
    111     return cnt;
    112 }
    113 
    114 void linkedStack::displayStack()
    115 {
    116     if( stackEmpty() )
    117     {
    118         cerr << "Stack is empty!Error in linkedStack::displayStack()" << endl;
    119         return;
    120     }
    121     LStack *tmp = top;
    122     int column = 0;
    123     while( tmp->link )
    124     {
    125         cout << setw(7) << setiosflags(ios::left) << tmp->data << " ";
    126         //cout << tmp->data << " ";
    127         column ++;
    128         if( column % 10 == 0 )
    129             cout << setw(7) << setiosflags(ios::left) << endl;
    130         tmp = tmp->link;
    131     }
    132     cout << endl;
    133 }
    134 
    135 int linkedStack::isp( char _operator )
    136 {
    137     switch(_operator)
    138     {
    139     case '#' :
    140         return 0;
    141         break;
    142     case '(':
    143         return 6;
    144         break;
    145     case '*':
    146         return 5;
    147         break;
    148     case '/':
    149         return 5;
    150         break;
    151     case '%':
    152         return 5;
    153         break;
    154     case '+':
    155         return 3;
    156         break;
    157     case '-':
    158         return 3;
    159         break;
    160     case ')':
    161         return 1;
    162         break;
    163     }
    164 
    165     cerr << "Error in SeqStack::isp" << endl;
    166     return -1;
    167 }
    168 
    169 int linkedStack::icp( char _operator )
    170 {
    171     switch(_operator)
    172     {
    173     case '#' :
    174         return 0;
    175         break;
    176     case '(':
    177         return 1;
    178         break;
    179     case '*':
    180         return 4;
    181         break;
    182     case '/':
    183         return 4;
    184         break;
    185     case '%':
    186         return 4;
    187         break;
    188     case '+':
    189         return 2;
    190         break;
    191     case '-':
    192         return 2;
    193         break;
    194     case ')':
    195         return 6;
    196         break;
    197     }
    198 
    199     cerr << "Error in SeqStack::icp" << endl;
    200     return -1;
    201 }
    202 
    203 double linkedStack::doOperator( elementType value1, elementType value2, char _operator )
    204 {
    205     switch(_operator)
    206     {
    207     case '+':
    208         return value1 + value2;
    209         break;
    210     case '-':
    211         return value1 - value2;
    212         break;
    213     case '*':
    214         return value1 * value2;
    215         break;
    216     case '/':
    217         if( fabs(value2) < 0.0001 )
    218         {
    219             cout << "Divided by 0!" << endl;
    220             return -1000000;
    221         }
    222         else
    223             return value1 / value2;
    224         break;
    225     case '%':
    226         if( fabs(value2) < 0.0001 )
    227         {
    228             cout << "Divided by 0!" << endl;
    229             return -1000000;
    230         }
    231         else
    232             return (int)value1 % (int)value2;
    233         break;
    234         
    235     }
    236 
    237     cerr << "Error in SeqStack::doOperator" << endl;
    238     return -1;
    239 }
    240 
    241 void linkedStack::calculate( char* Str )
    242 {
    243     charLinkedStack css1;
    244     char ch1;
    245     int i = 0;
    246     double a, b;
    247     
    248     int level = 0;
    249     int temp = 0;
    250  
    251     while ( Str[i] != '' )
    252     {
    253         i ++;
    254     }
    255     i = i - 2;
    256     while( css1.topValue() != NULL || Str[i] != '#' )
    257     {
    258         char ch = Str[i];
    259         if ( isdigit(ch) )
    260         {
    261             temp = temp + pow( 10, level ) * int( ch - '0' );
    262             level ++;
    263             i --;
    264         }
    265         else
    266         {
    267             if (level)
    268             {
    269                 push(temp);
    270                 temp = 0;
    271                 level = 0;
    272             }
    273             css1.getTop(ch1);
    274             if ( ch1 == ')' && ch == '(' )
    275             {
    276                 css1.pop();
    277                 i --;
    278                 continue;
    279             }
    280             if ( isp(ch1) < icp(ch) )
    281             {
    282                 css1.push(ch);
    283                 i --;
    284             }
    285             else if (isp(ch1) >= icp(ch))
    286             {
    287                 getTop(a);
    288                 pop();
    289                 getTop(b);
    290                 pop();
    291                 push( doOperator( a, b, ch1 ) );
    292                 css1.pop();
    293             }
    294         }
    295     }
    296 
    297     if (level)
    298     {
    299         push(temp);
    300     }
    301      
    302 }
    303 
    304 bool linkedStack::isPopOrder()
    305 {
    306     /*
    307     当序列递增时,ok
    308     当序列递减时,且相差为1 ,ok
    309     当序列递减时,且相差大于1,但后续序列都递减时,ok
    310     当序列递减时,且相差大于1,但后续序列非严格递减时,no
    311 
    312     直到序列递减大于1时,如果后续序列严格递减,则ok,否则no。其他情况都ok。
    313     */
    314     if( stackEmpty() )
    315     {
    316         return true;
    317     }
    318     bool decrease = true, increase = true, D_valueThanOne = false, D_valueEqualOne = true;
    319     elementType value1, value2;
    320 
    321     getTop(value1);
    322     pop();
    323     while( !stackEmpty() )//原序列递增,弹栈序列递减;原序列递减,弹栈序列递增
    324     {
    325         
    326         getTop(value2);
    327         //pop();
    328         //if( value2 > value1 && value2 - value1 > 1 )
    329         if( value1 > value2 && fabs( value2 - value1 ) > 1 )
    330         {    
    331             while( !stackEmpty() )
    332             {
    333                 if( value1 >= value2 )
    334                 {
    335                     cout << fabs( value2 - value1 ) << endl;
    336                     value1 = value2;
    337                     pop();
    338                 }
    339                 else
    340                     return false;
    341             }
    342         }
    343         else
    344             pop();
    345     }
    346     return true;
    347 
    348 }
    349  
    350 bool linkedStack::judge(const elementType *sour, int s1, const elementType *dest, int s2 )        //不比更改两个序列的内容,所以可加const修饰限定符
    351 {
    352      assert(sour);//断言可防止NULL指针的传入(避免传入指针引起程序崩溃的问题)
    353      assert(dest);
    354     //stack<char> ss;//借助库函数创建一个栈
    355     linkedStack ss;
    356     if (s1 != s2) //如果两个序列不一样长,自然是非法的序列
    357         return false;
    358  
    359     ss.push(*sour++); //将首元素压栈
    360     while (*dest != 0)  
    361     {
    362  
    363         if (ss.stackEmpty() && *sour != 0) //如果栈为空且入栈序列未结束,则不断压入元素
    364             ss.push(*sour++);
    365         double x;
    366         ss.getTop(x);
    367         while (*dest != x && *sour != 0) 
    368         {
    369             ss.push(*sour++);//如果出栈元素和栈顶元素不匹配则继续压入元素
    370             ss.getTop(x);
    371         }
    372         ss.getTop(x);
    373         if (*dest == x )  //如果两者相等,将该元素弹出,且指针指向出栈序列的下一位置上
    374         {
    375             dest++;
    376             ss.pop();
    377             continue;
    378         }
    379         ss.getTop(x);
    380         if (*sour == 0&& x != *dest)  //如果一直不相等,知道入栈序列结束仍为匹配上,说明出栈序列非法
    381         {
    382             return false;
    383         }
    384     }
    385     return true;//否则序列合法
    386 }
    387 
    388 void linkedStack::printValidPopStackSequence( int n, elementType *A, int cur )
    389 {
    390     ios::sync_with_stdio(false);
    391     double B[8];
    392     for( int i = 0; i < n; i ++ )
    393         B[i] = i + 1;
    394     B[n] =  0;
    395     
    396     if( cur == n )
    397     {
    398         A[n] = 0;
    399         if( judge( B, n + 1, A, n + 1 ) )
    400         {
    401             for( int i = 0; i < n; i ++ )
    402             {
    403                 cout << A[i] << " ";
    404             }
    405             cout << endl;
    406         }
    407     }
    408     else
    409     {
    410         for( int j = 1; j <= n; j ++ )
    411         {
    412             bool ok = true;
    413         for( int k = 0; k < cur; k ++ )
    414         {
    415             if( A[k] == j )
    416                 ok = false;
    417         }
    418         if(ok)
    419         {
    420             A[cur] = j;
    421             printValidPopStackSequence( n, A, cur + 1 );
    422         }
    423    }
    424     }
    425 }
     1 // charLinkedStack.h: interface for the charLinkedStack class.
     2 //
     3 //////////////////////////////////////////////////////////////////////
     4 
     5 #if !defined(AFX_CHARLINKEDSTACK_H__CBB1096F_5E0D_4725_8583_A16EF4EA8502__INCLUDED_)
     6 #define AFX_CHARLINKEDSTACK_H__CBB1096F_5E0D_4725_8583_A16EF4EA8502__INCLUDED_
     7 
     8 #if _MSC_VER > 1000
     9 #pragma once
    10 #endif // _MSC_VER > 1000
    11 
    12 class charLinkedStack  
    13 {
    14 public:
    15     charLinkedStack();
    16     virtual ~charLinkedStack();
    17     bool stackEmpty();
    18     //bool stackFull();
    19     bool getTop( elementType1& value );
    20     bool push( elementType1 value );
    21     bool pop();
    22     int length();
    23     void displayStack();
    24     CPStack topValue();
    25     void decToHex( long value );
    26     bool brancheMatch( char *Str );
    27     bool charLinkedStack::judge(const char *sour, const char *dest);
    28     friend ostream &operator<< ( ostream &os, const charLinkedStack &a )
    29     {
    30         //for ( int i = 0; i < a.top + 1; i ++ )
    31         //{
    32         //    if (a.top == -1)
    33         //        return os;
    34         //    os << a.data[i];
    35         //}
    36         CLStack *tmp = a.top;
    37         int column = 0;
    38         while( tmp->link )
    39         {
    40             //cout << tmp->data << " ";
    41             if( tmp->link == NULL )
    42                 return os;
    43                 //break;
    44             os << tmp->data;
    45             //os << setw(7) << setiosflags(ios::left) << tmp->data << " ";
    46             //column ++;
    47             //if( column % 10 == 0 )
    48                 //os << setw(7) << setiosflags(ios::left) << endl;
    49             tmp = tmp->link;
    50         }
    51         os << endl;
    52 
    53         return os;
    54     }
    55 private:
    56     CLStack *top;
    57     int len;
    58 
    59 };
    60 
    61 #endif // !defined(AFX_CHARLINKEDSTACK_H__CBB1096F_5E0D_4725_8583_A16EF4EA8502__INCLUDED_)
      1 // charLinkedStack.cpp: implementation of the charLinkedStack class.
      2 //
      3 //////////////////////////////////////////////////////////////////////
      4 
      5 #include "stdafx.h"
      6 #include "charLinkedStack.h"
      7 
      8 //////////////////////////////////////////////////////////////////////
      9 // Construction/Destruction
     10 //////////////////////////////////////////////////////////////////////
     11 
     12 charLinkedStack::charLinkedStack()
     13 {
     14     top = new CLStack;
     15     if( !top )
     16     {
     17         cerr << "Space allocating falied!Error in linkedStack::linkedStack()!" << endl;
     18     }
     19     top->link = NULL;
     20     //top = NULL;
     21     len = 0;
     22 }
     23 
     24 charLinkedStack::~charLinkedStack()
     25 {
     26     while(top)
     27     {
     28         CLStack *q = top;
     29         top = top->link;
     30         delete q;
     31     }
     32     top = NULL;
     33 }
     34 
     35 bool charLinkedStack::stackEmpty()
     36 {
     37     //follow style is not suitable for the code
     38     //return top == NULL;
     39     return top->link == NULL;
     40 }
     41 
     42 bool charLinkedStack::getTop( elementType1& value )
     43 {
     44     if( stackEmpty() )
     45     {
     46         //cerr << "Stack is Empty!Error in linkedStack::getTop!" << endl;
     47         value = '#';
     48         return false;
     49     }
     50     value = top->data;
     51     return false;
     52 }
     53 
     54 bool charLinkedStack::push( elementType1 value )
     55 {
     56     CLStack *newNode = new CLStack;
     57     if( !newNode )
     58     {
     59         cerr << "Space allocating falied!" << endl;
     60         return false;
     61     }
     62     newNode->data = value;
     63     newNode->link = top;
     64     top = newNode;
     65     len ++;
     66     return true;
     67 }
     68 
     69 bool charLinkedStack::pop()
     70 {
     71     if( stackEmpty() )
     72     {
     73         cerr << "Stack is empty!Error in linkedStack::pop()!" << endl;
     74         return false;
     75     }
     76     CLStack *tmp = top;
     77     
     78     top = top->link;
     79     delete tmp;
     80     len --;
     81     return true;
     82 }
     83 
     84 int charLinkedStack::length()
     85 {
     86     if( stackEmpty() )
     87     {
     88         cerr << "Stack is empty!Error in linkedStack::length()" << endl;
     89         return -1;
     90     }
     91     int cnt = 0;
     92     CLStack *tmp = top;
     93     while( tmp->link )
     94     {
     95         tmp = tmp->link;
     96         cnt ++;
     97     }
     98     return cnt;
     99 }
    100 
    101 void charLinkedStack::displayStack()
    102 {
    103     if( stackEmpty() )
    104     {
    105         cerr << "Stack is empty!Error in linkedStack::displayStack()" << endl;
    106         return;
    107     }
    108     CLStack *tmp = top;
    109     int column = 0;
    110     while( tmp->link )
    111     {
    112         cout << setw(7) << setiosflags(ios::left) << tmp->data << " ";
    113         //cout << tmp->data << " ";
    114         column ++;
    115         if( column % 10 == 0 )
    116             cout << setw(7) << setiosflags(ios::left) << endl;
    117         tmp = tmp->link;
    118     }
    119     cout << endl;
    120 }
    121 
    122 CPStack charLinkedStack::topValue()
    123 {
    124     return top->link;//write as "return top;" is not available
    125 }
    126 
    127 void charLinkedStack::decToHex( ll value )
    128 {
    129     ll tmp = value;
    130     while(tmp)
    131     {
    132         ll mod = tmp % 16;
    133         if( mod <= 9 )
    134         {
    135             push( (char) ( mod + '0' ) );
    136         }
    137         else
    138         {
    139             switch(mod)
    140             {
    141             case 10:
    142                 push('A');
    143                 break;
    144             case 11:
    145                 push('B');
    146                 break;
    147             case 12:
    148                 push('C');
    149                 break;
    150             case 13:
    151                 push('D');
    152                 break;
    153             case 14:
    154                 push('E');
    155                 break;
    156             case 15:
    157                 push('F');
    158                 break;
    159             default:
    160                 cerr << "Error in void charSeqStack::transfor()" << endl;
    161                 break;
    162             }
    163         }
    164         tmp /= 16;
    165     }
    166 }
    167 
    168 bool charLinkedStack::brancheMatch( char *Str )
    169 {
    170     
    171     int i = 0;
    172     char ch = Str[i];
    173     elementType1 ch1 = NULL;
    174     while( ch != '' )
    175     {
    176         if( ch == '(' || ch == '[' || ch == '{' )
    177         {
    178             push(ch);
    179             
    180         }
    181         else if( ch == ')' || ch == ']' || ch == '}' )
    182         {
    183             //ch1 = NULL;
    184             if( !stackEmpty() )
    185             {
    186                 //ch1 = NULL;
    187                 getTop(ch1);
    188                 //把下面这句话放到下面这个if判断里面结果就正确了
    189                 //pop();
    190                 //cout << (*this) << endl;
    191                 if( ( ch == ')' && ch1 == '(' ) || 
    192                     ( ch == ']' && ch1 == '[' ) || ( ch == '}' && ch1 == '{' ) )
    193                 {
    194                     //ch = NULL;
    195                     //ch1 = NULL;
    196                     pop();
    197                     //continue;
    198                 }    //ch = Str[ ++ i ];
    199                 
    200                 else if( ( ch == ')' && ch1 != '(' ) || 
    201                     ( ch == ']' && ch1 != '[' ) || ( ch == '}' && ch1 != '{' ) )
    202                     return false;
    203             }
    204             
    205             else //if( stackEmpty() && !ch1 )
    206                 return false;
    207         }
    208         
    209         ch = Str[ ++ i ];
    210     }
    211     if( stackEmpty() )
    212     {
    213         return true;
    214     }
    215     
    216     while( !stackEmpty() )
    217     {
    218         pop();
    219         
    220     }
    221     
    222     return false;
    223 }
    224  
    225 bool charLinkedStack::judge(const char *sour, const char *dest)        //不比更改两个序列的内容,所以可加const修饰限定符
    226 {
    227      assert(sour);//断言可防止NULL指针的传入(避免传入指针引起程序崩溃的问题)
    228      assert(dest);
    229     //stack<char> ss;//借助库函数创建一个栈
    230     charLinkedStack ss;
    231     if (strlen(sour) != strlen(dest)) //如果两个序列不一样长,自然是非法的序列
    232         return false;
    233  
    234     ss.push(*sour++); //将首元素压栈
    235     while (*dest != '')  
    236     {
    237  
    238         if (ss.stackEmpty() && *sour != '') //如果栈为空且入栈序列未结束,则不断压入元素
    239             ss.push(*sour++);
    240         char x;
    241         ss.getTop(x);
    242         while (*dest != x && *sour != '') 
    243         {
    244             ss.push(*sour++);//如果出栈元素和栈顶元素不匹配则继续压入元素
    245             ss.getTop(x);
    246         }
    247         ss.getTop(x);
    248         if (*dest == x )  //如果两者相等,将该元素弹出,且指针指向出栈序列的下一位置上
    249         {
    250             dest++;
    251             ss.pop();
    252             continue;
    253         }
    254         ss.getTop(x);
    255         if (*sour == ''&& x != *dest)  //如果一直不相等,知道入栈序列结束仍为匹配上,说明出栈序列非法
    256         {
    257             return false;
    258         }
    259     }
    260     return true;//否则序列合法
    261 }
      1 // _LinkedStack.cpp : Defines the entry point for the console application.
      2 //
      3 
      4 #include "stdafx.h"
      5 #include "linkedStack.h"
      6 
      7 /*
      8 void test()
      9 {
     10     ios::sync_with_stdio(false);
     11     //freopen( "x1.in", "r", stdin );
     12     FILE *fp = fopen( "x1.in", "r" );
     13     //cout << "werfe" << endl;
     14     linkedStack LS1;
     15     charLinkedStack CLS1, CLS2;
     16     for( int i = 1; i <= 113; i ++ )
     17     {
     18         //LS1.push(i);
     19     }
     20     //cout << LS1 << endl;
     21     //LS1.displayStack();
     22 
     23     for( int j = 0; j <= 26; j ++ )
     24     {
     25         //CLS1.push( (char)( 'A' + j ) );
     26     }
     27     /*
     28     char Str[] = "#12+5*(2+3)*6/2-4#";
     29     LS1.calculate(Str);
     30     cout << LS1;
     31     ll n;
     32     //while( cin >> n )
     33     {
     34         cin >> n;
     35         CLS1.decToHex(n);
     36         cout << CLS1;
     37         //CLS1.~charLinkedStack();
     38     }
     39     
     40     char Str2[1000];
     41     while(1)
     42     {
     43         gets(Str2);
     44         if(CLS2.brancheMatch(Str2) )
     45             cout << "YES!" << endl;
     46         else
     47             cout << "NO!" << endl;
     48     }
     49     //cout << CLS1;
     50     //cout << LS1.length() << endl;
     51     //int x;
     52     //LS1.getTop(x);
     53     //cout << x << endl;
     54     //LS1.pop();
     55     //LS1.getTop(x);
     56     //cout << endl;
     57     cin.get();
     58 }
     59 */
     60 
     61 int main(int argc, char* argv[])
     62 {
     63     /*
     64     while(1)
     65     {
     66         test();
     67     }
     68     
     69     ios::sync_with_stdio(false);
     70     //freopen( "x1.in", "r", stdin );
     71     
     72     //freopen( "x1.out", "w", stdout );
     73     */
     74     //FILE *fp = fopen( "x1.in", "r" );
     75     /*
     76     //cout << "werfe" << endl;
     77     linkedStack LS1;
     78     charLinkedStack CLS1, CLS2;
     79     //for( int i = 1; i <= 113; i ++ )
     80     //{
     81         //LS1.push(i);
     82     //}
     83     //cout << LS1 << endl;
     84     //LS1.displayStack();
     85 
     86     //for( int j = 0; j <= 26; j ++ )
     87 //    {
     88         //CLS1.push( (char)( 'A' + j ) );
     89 //    }
     90     
     91     linkedStack LS1;
     92     char Str[] = "#12+5*(2+3)*6/2-4#", Str2[] = "#34456%3+100*5+3-100#";
     93     LS1.calculate(Str);
     94     for( int i = 1;  Str[i] != '#' && i < strlen(Str); i++ )
     95         cout << Str[i];
     96     cout << " = " << LS1;
     97     LS1.pop();
     98     LS1.calculate(Str2);
     99     for( i = 1;  Str2[i] != '#' && i < strlen(Str2); i++ )
    100         cout << Str2[i];
    101     cout << " = " << LS1;
    102     
    103     charLinkedStack CLS1;
    104     ll n;
    105     while( cin >> n )
    106     {
    107         //cin >> n;
    108         CLS1.decToHex(n);
    109         cout << CLS1;
    110         while( !CLS1.stackEmpty() )
    111             CLS1.pop();
    112         //CLS1.~charLinkedStack();
    113     }
    114     
    115     charLinkedStack CLS2;
    116     char Str2[1000];
    117     while( fgets( Str2, 1000, fp ) != NULL )
    118     {
    119         //gets(Str2);
    120         if( CLS2.brancheMatch(Str2) )
    121             cout << Str2 << " ---> legal!" << endl;
    122         else
    123             cout << Str2 << " ---> illegal!" << endl;
    124     }
    125     
    126     linkedStack LS2;
    127     
    128     for( int i = 1; i <= 10; i ++ )
    129     {
    130         LS2.push(i);
    131     }
    132     
    133     LS2.push(1.0);
    134     LS2.push(4.0);
    135     LS2.push(2.0);
    136     LS2.push(3.0);
    137     
    138     cout << LS2 << endl;
    139     if( LS2.isPopOrder() )
    140         cout << " --- legal" <<endl;
    141     else
    142         cout << " --- illegal" << endl;
    143     
    144     linkedStack LS3;
    145     elementType Arr1[] = { 1, 2, 3, 4 }, Arr2[5];//, Arr2[] = { 1, 4, 2, 3 };
    146     //elementType Arr1[100], Arr2[100];
    147 
    148     int cnt = 0;
    149     
    150     while( cnt ++ < 24 )
    151     {
    152         //if( LS3.judgeIsLegal( Arr1, Arr2 ) )
    153         for( int i = 0; i < 5; i ++ )
    154             cin >> Arr2[i];
    155         if( LS3.judge( Arr1, 5, Arr2, 5 ) )
    156         {
    157             cout << setw(2) << cnt << " : ";
    158             for( int j = 0; j < 4; j ++ )
    159                 cout << Arr2[j] << " ";
    160             cout << " ---> legal!" << endl;
    161         }
    162         else
    163         {
    164             //cout << cnt << " ---> NO!" << endl;
    165             cout << setw(2) << cnt << " : ";
    166             for( int j = 0; j < 4; j ++ )
    167                 cout << Arr2[j] << " ";
    168             cout << " ---> illegal!" << endl;
    169         }
    170     }
    171 
    172     */
    173     linkedStack  LS5;
    174     elementType A[8];
    175     cout << "The valid out-of-stack sequences of 1 to 7 are:" << endl;
    176     LS5.printValidPopStackSequence( 7, A, 0 );
    177 
    178     /*
    179     
    180     charLinkedStack ss;
    181     char Str[4];
    182     int cnt = 0;
    183     while( cnt ++ < 24 )
    184     {
    185         gets(Str);
    186         cout << cnt << " : " << Str << " --- " << ss.judge( "abcd",Str ) << endl;
    187     }
    188     */
    189     cin.get();
    190     return 0;
    191 }
  • 相关阅读:
    NuGet文件下载与应用
    两款Mongodb可视化工具
    原创 | 入门数据分析--SQL常用操作(+提取数据实例)
    原创 | 入门数据分析--数据存储之常用数据库及区别
    原创 | 入门数据分析--如何获取外部数据(+python爬虫实例)?
    原创 | 入门数据分析--如何建立需求解决框架?
    原创 | 入门数据分析--如何进行需求判定?
    原创 | 入门数据分析--如何更好的理解业务?
    原创 | 如何入门数据分析?
    原创 | 数据分析师的前景如何?
  • 原文地址:https://www.cnblogs.com/25th-engineer/p/9940191.html
Copyright © 2011-2022 走看看