用链式栈实现括号匹配问题
思路
逐个字符录入(循环实现),如果录入到左括号就压栈
如果录入到右括号就弹栈
此时有两种情况:
1、栈空 则括号不匹配
2、栈不空 则括号可能匹配
对于第二种情况我们又分点
设置一个bool类型的量,如果当前的右括号与栈中弹出的左括号不匹配,则该bool类型值为 0,不匹配 。
在循环结束后我们还需要判断左括号是否比右括号多,即判断栈是否为空,若不空,则不匹配 。
代码
头文件
#include<iostream>
using namespace std;
链式栈构建
template <class T>
class LStack;
template <class T>
class SLNode{
friend class LStack<T>;
private:
T data;
SLNode<T> * next;
};
template <class T>
class LStack{
private:
SLNode<T> * top;
public:
LStack(); //构造函数
~LStack(); //析构函数
void Clear(); //栈的清空
bool Pop(T &item); //栈的弹出
bool Pop();
bool Push(const T &item); //栈的压入
bool Peek(T &item); //访问栈顶元素
bool IsEmpty(); //是否栈空
};
template <class T>
LStack<T>::LStack()
{
top = NULL;
}
template <class T>
LStack<T>::~LStack()
{
Clear();
}
template <class T>
void LStack<T>::Clear()
{
while(top)
{
Pop();
}
}
template <class T>
bool LStack<T>::Pop(T &item)
{
SLNode<T> * q;
if(top == NULL)
{
cout<<"栈空无法弹出"<<endl;
return false;
}
q = top;
item = top->data;
top = top->next;
delete q;
return true;
}
template <class T>
bool LStack<T>::Pop()
{
SLNode<T> * q;
if(top == NULL)
{
cout<<"栈空无法弹出"<<endl;
return false;
}
q = top;
top = top->next;
delete q;
return true;
}
template <class T>
bool LStack<T>::Push(const T &item)
{
SLNode<T> *s =new SLNode<T>;
s->data = item;
s->next = top;
top = s;
return true;
}
template <class T>
bool LStack<T>::Peek(T &item)
{
if(top == NULL)
{
cout<<"栈空"<<endl;
return false;
}
item = top->data;
return true;
}
template <class T>
bool LStack<T>::IsEmpty()
{
if(top == NULL)
return true;
else return false;
}
主函数
int main(int argc,char **argv)
{
LStack<char>bracket; //声明一个链式对象
char read_in = cin.get();
bool is_matched = true;
while(is_matched && read_in != '\n')
{
if(read_in == '{'||read_in == '['||read_in == '(')//输入开括号,则将其压入栈
bracket.Push(read_in);
if(read_in == '}'||read_in == ']'||read_in == ')')//若输入关括号,则检测是否匹配
{
if(bracket.IsEmpty())
{
cout<<read_in<<"不匹配"<<endl;
is_matched = false;
return 0;
}
char open_bracket;
bracket.Pop(open_bracket);
is_matched = (open_bracket == '(' && read_in == ')')
||(open_bracket == '[' && read_in == ']' )
||(open_bracket == '{' && read_in == '}');
if(!is_matched)
{
cout<<"不匹配"<<read_in<<open_bracket<<endl;
return 0;
}
}
read_in = cin.get();
}
if(!bracket.IsEmpty())
{
cout<<"不匹配"<<endl;
return 0;
}
cout<<"匹配成功"<<endl;
return 0;
}