一个简单的程序,展示了链表如何作为栈使用,具有
后进先出(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.
|