发布
2012年1月7日 (最后更新:2012年1月7日)

括号检查器

得分:3.6/5 (51票)
*****
一个简单的程序,展示了链表如何作为栈使用,具有后进先出(LIFO)的访问方式。
本程序基于iterator函数。程序将提示用户输入一个字符串。该函数将该字符串作为参数。然后,函数将解析整个字符串。每次迭代都会进行三个检查。

1. 如果括号不匹配,例如'{'与']'匹配
2. 如果只有开括号
3. 如果只有闭括号

过程流程是程序逐个字符读取字符串输入。如果当前迭代的字符是开括号,即'{'、'['或'(',它将被推入栈对象list。现在,如果程序遇到闭括号,它将调用list的pop函数,并检查弹出的对象。如果弹出的对象是'\a',它是一个标志,表示栈为空。这意味着字符串包含一个没有配对的闭括号。这是一个不一致,所以它将返回false。否则,将比较弹出的对象和当前迭代的字符以检查它们是否匹配。如果匹配,循环将继续,否则将返回false。在程序解析完整个字符串后,它将检查栈是否为空。此时,如果栈不为空,则意味着存在某个开括号没有对应的闭括号。所以这将返回false。最后,如果上述三个检查都成功,函数将返回true。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <string>
#include <Windows.h>

struct node
{
 char c;
 node* next;
 node()
 {
  next = nullptr;
 }
};

class stack
{
 private:
	     node* head;
 public:
	     stack()
			: head(nullptr)
		 {}

	bool is_empty()
		 {
		  if(!this->head)
		    return true;
		  else
		    return false;
		 }
		 
		 void push(char c)
		 {
                  node* p = new node;
                  p->c = c;
	      if(this->is_empty())
	       this->head = p;
	      else
	      {
	       p->next = this->head;
	       this->head = p;
              }
		 }

		 char pop()
		 {
		  if(this->is_empty())
           return '\a';
          else
          {
           node* tmp = this->head;
           this->head = this->head->next;
		   char c = tmp->c;
		   delete tmp;
		   return c;
          }
		 }
};

//////////////////////////////////////////////////////////////////////////

inline bool iterator(std :: string& exp)
{
 stack list;
 for(int i=0;i<exp.size();i++)
 {
  if(exp[i] == '[' ||
     exp[i] == '{' ||
     exp[i] == '(')
   list.push(exp[i]);//when an opening bracket is found, push it in the stack
  if (exp[i] == ']' ||
	  exp[i] == '}' ||
	  exp[i] == ')')
  {
   char c = list.pop();
   if (c == '\a')
	return false; //if the expression has only closing brackets  
   else
   {
	if(c == '[' && exp[i] == ']' ||
	   c == '{' && exp[i] == '}' ||
	   c == '(' && exp[i] == ')');
	else
     return false; //if mismatch
   }
  }
 }
 if (!list.is_empty())
  return false; //if the expression has only opening brackets
 else
  return true;
}

int main()
{
 SetConsoleTitle("PARANTHESIS CHECKER");
 std :: string exp;
 std :: cout<<"Enter the expression: ";
 getline(std :: cin,
	     exp);
 if(iterator(exp))
   std :: cout<<"The expression "<<exp<<" is consistent in brackets.\n\n";
 else
   std :: cout<<"The expression "<<exp<<" is inconsistent in brackets.\n\n";
 system("pause");
 return 0;
}


输出

Enter the expression: 3x+432[
The expression 3x+432[ is inconsistent in brackets.



Enter the expression: 3x+(4/7+[6/a])
The expression 3x+(4/7+[6/a]) is consistent in brackets.