Stack of applications - symbols match

 1 //
 2 //  Stack.h
 3 //  顺序栈
 4 //
 5 //  Created by geshenglu on 2020/3/21.
 6 //  Copyright © 2020 geshenglu. All rights reserved.
 7 //
 8 
 9 #ifndef Stack_h
10 #define Stack_h
11 template<class Elemtype>
12 class Stack
13 {
14 public:
15     virtual bool IsEmpty() const =0;
16     virtual void Push(const Elemtype&x)=0;
17     virtual Elemtype Pop()=0;
18     virtual Elemtype Top()const =0;
19     virtual ~Stack(){};
20 };
21 #endif /* Stack_h */
 1 //
 2 //  SeqStack.h
 3 //  顺序栈
 4 //
 5 //  Created by geshenglu on 2020/3/21.
 6 //  Copyright © 2020 geshenglu. All rights reserved.
 7 //
 8 
 9 #ifndef SeqStack_h
10 #define SeqStack_h
11 #include "Stack.h"
12 template<class Elemtype>
13 class SeqStack:public Stack<Elemtype>
14 {
15 private:
16     Elemtype *data;
17     int maxSize;
18     int top_p;
19     void doubleSpace();
20 public:
21     SeqStack(int initSize = 10)
22     {
23         maxSize = initSize;
24         data =  new Elemtype[maxSize];
25         top_p = -1;
26     }
27     ~SeqStack()
28     {
29         delete [] data;
30     }
31     virtual bool IsEmpty() const override;
32     virtual void Push(const Elemtype&x)override;
33     virtual Elemtype Pop()override;
34     virtual Elemtype Top()const override;
35 };
36 
37 template<class Elemtype>
38 void SeqStack<Elemtype>::doubleSpace()
39 {
40     Elemtype *tmp = data;
41     data = new  Elemtype[maxSize*2];
42     for (int i=0; i<maxSize; ++i)
43         data[i] = tmp[i];
44     maxSize *= 2;
45     delete tmp;
46 }
47 
48 template<class Elemtype>
49  bool SeqStack<Elemtype>::IsEmpty() const
50 {
51     return top_p == -1;
52 }
53 
54 template<class Elemtype>
55 void SeqStack<Elemtype>::Push(const Elemtype&x)
56 {
57     if(top_p == maxSize - 1)
58     {
59         doubleSpace();
60     }
61     data[++top_p]=x;
62 }
63 
64 template<class Elemtype>
65 Elemtype SeqStack<Elemtype>::Pop()
66 {
67     return data[top_p--];
68 }
69 
70 
71 template<class Elemtype>
72 Elemtype SeqStack<Elemtype>::Top() const
73 {
74     return data[top_p];
75 }
76 
77 #endif /* SeqStack_h */
 1 //
 2 //  Balance.h
 3 //  括号匹配
 4 //
 5 //  Created by geshenglu on 2020/3/25.
 6 //  Copyright © 2020 geshenglu. All rights reserved.
 7 //
 8 
 9 #ifndef Balance_h
10 #define Balance_h
11 #include <fstream>
12 class Balance{
13     std::ifstream fin;
14     int currentLine;
15     int Errors;
16     struct Symbol{
17         char Token;
18         int TheLine;
19     };
20     enum class CommentTpye{
21         SlashSlash,
22         SlashStar
23     };
24     bool CheckMatch(char Symba1,char Symba2,int Line1,int Line2);
25     char GetNextSymbol();
26     void PutBackChar(char ch);
27     void SkipComment(enum class CommentTyp type);
28     void SkipQuote(char type);
29     char NextChar();
30 public:
31     Balance(const char *s);
32     int CheckBalance();
33     class NoFile{};
34 };
35 
36 #endif /* Balance_h */
  1 //
  2 //  Balance.cpp
  3 //  括号匹配
  4 //
  5 //  Created by geshenglu on 2020/3/25.
  6 //  Copyright © 2020 geshenglu. All rights reserved.
  7 //
  8 
  9 #include "Balance.h"
 10 #include "SeqStack.h"
 11 #include <iostream>
 12 Balance::Balance(const char *s){
 13     fin.open(s);
 14     if(!fin)
 15         throw NoFile();
 16     currentLine = 1;
 17     Errors = 0;
 18 }
 19 
 20 int Balance::CheckBalance(){
 21     struct Symbol node;
 22     SeqStack<Symbol> stack;
 23     char lastChar,match;
 24     while(lastChar = GetNextSymbol()){
 25         switch (lastChar) {
 26             case '{':case '[':case '(':
 27                 node.Token = lastChar;
 28                 node.TheLine = currentLine;
 29                 stack.Push(node);
 30                 break;
 31             case '}':case '}':case ')':
 32                 if (stack.IsEmpty()) {
 33                     ++Errors;
 34                     std::cout<<"在第"<<currentLine<<"有一个多余的"<<lastChar<<std::endl;
 35                 }
 36                 else{
 37                     node = stack.Pop();
 38                     match = node.Token;
 39                     if(!CheckMatch(match, lastChar, node.TheLine, currentLine))
 40                         ++Errors;
 41                 }
 42                 break;
 43         }
 44     }
 45     while (!stack.IsEmpty()) {
 46         ++Errors;
 47         node = stack.Pop();
 48         std::cout<<"在第"<<node.TheLine<<"行的符号"<<node.Token<<"不匹配!"<<std::endl;
 49     }
 50     return Errors;
 51 }
 52 
 53 bool Balance::CheckMatch(char Symba1,char Symba2,int Line1,int Line2){
 54     if(Symba1=='{'&&Symba2!='}' || Symba1 == ' ( ' && Symba2! = ' ) ' || Symba1 == ' [ ' && Symba2! = ' } ' ) {
 55          STD :: COUT << " Discovery " << << Linel " line symbol " << << Symba1 " first " << << Line2 " symbol rows does not match the " << STD :: endl;
 56 is          return  to false ;
 57     }
 58     return true;
 59 }
 60 
 61 char Balance::GetNextSymbol(){
 62     char ch;
 63     while (ch = NextChar()) {
 64         if(ch == '\'){
 65             ch = NextChar();
 66             if(ch == '\'){
 67                 SkipComment(SlashSlash);
 68             }
 69             else if(ch == '*')
 70                 SkipComment(SlashStar);
 71             else
 72                 PutBackChar(ch);
 73         }
 74         else if(ch == '\''||ch == '"'){
 75             SkipQuote(ch);
 76         }
 77         else if(ch == '('||ch == '{'||ch == '['){
 78             return ch;
 79         }
 80     }
 81     return nullptr;
 82 }
 83 
 84 void Balance::PutBackChar(char ch){
 85     fin.putback(ch);
 86     if(ch == '\n')
 87         --currentLine;
 88 }
 89 
 90 void Balance::SkipComment(enum CommentType type){
 91     char ch,flag;
 92     if(type == SlashSlash){
 93         while (ch = NextChar() && ch != '\n');
 94         return;
 95     }
 96     flag = '';
 97     while((ch = NextChar())!= nullptr){
 98         if(flag == '*' && ch == '/')
 99             return;
100         flag = ch;
101     }
102     ++Errors;
103     std::cout<<"Comment is unterminated!"<<std::endl;
104 }
105 
106 void Balance::SkipQuote(char type){
107     char ch;
108     while(ch = NextChar()){
109         if(ch == type)
110             return;
111         else if (ch == '\n'){
112             ++Errors;
113             std::cout<<"missing closing quote at line"<<currentLine<<std::endl;
114             return;
115         }
116         else if(ch == '\\')
117             ch = NextChar();
118     }
119 }
120 
121 char Balance::NextChar(){
122     char ch;
123     if((ch = fin.get())==EOF)
124         return nullptr;
125     if(ch == '\n')
126         ++currentLine;
127     return  ch;
128 }
 1 //
 2 //  main.cpp
 3 //  括号匹配
 4 //
 5 //  Created by geshenglu on 2020/3/25.
 6 //  Copyright © 2020 geshenglu. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include "Balance.h"
11 using namespace std;
12 
13 int main(int argc, const char * argv[]) {
14     char fileName[80];
15      Balance * P;
 16      int Result;
 . 17      the try {
 18 is          IF (argc == . 1 ) {
 . 19              COUT << " Please enter the file name: " << endl;
 20 is              CIN >> fileName;
 21 is              P = new new Balance (fileName) ;
 22 is              Result = p-> CheckBalance ();
 23 is              Delete P;
 24              COUT << " co " << << Result " ! error " <<endl;
25             return 0;
26         }
27         while(--argc){
28             cout<<"检查文件"<<*++argv<<endl;
29             p = new Balance(*argv);
30             result = p->CheckBalance();
31             delete p;
32             cout<<""<<result<<"个错误!"<<endl;
33         }
34     }
35     catch (Balance::NoFile){
36         cout<<"no catch file"<<endl;
37     }
38 
39     return 0;
40 }

 

Guess you like

Origin www.cnblogs.com/jiangnansytle/p/12642383.html