1. 程式人生 > >判括號匹配(順序棧)

判括號匹配(順序棧)

1.題目:

Problem Description

任意輸入一個由若干個圓括號、方括號和花括號組成的字串,設計一個演算法判斷該串中的括號是否配對。

Input

有多組資料,每組為一個包含3類括號的字串,串長不超過100。

Output

若該串中的括號匹配輸出1,否則輸出0。

Sample Input

([{}])
([{}})
([{)]}

Sample Output

1
0
0

2.參考程式碼:

#include <iostream>
#include <string.h>
using namespace std;

class SeqStack{   ///順序棧
private:
	char data[1111];
	int top;
public:
	SeqStack(){
		top=-1;
	}
	~SeqStack(){
		
	}
	void Push(char x){
		data[++top]=x;
	}
	char GetTop(){
		return data[top];
	}
	void Pop(){
		if(top!=-1)
			top--;
	}
	bool empty(){
		if(top==-1)
			return true;
		else 
			return false;
	}
};

int main()
{
	char s[1111];
	int i,len;
	while(gets(s))
	{
		len=strlen(s);
		SeqStack w;
		for(i=0;i<len;i++)
		{
			if(s[i]=='(' || s[i]=='[' || s[i]=='{')   
				w.Push(s[i]);
			    ///若遇到左圓括號,左花括號,左方括號,則直接入棧
			else if(s[i]==')')   ///遇到右圓括號
			{
				if(!w.empty())   ///若不為空
				{
					if(w.GetTop()=='(')   ///就判斷棧頂是否為左圓括號
						w.Pop();   ///是的話,就將棧頂的左圓括號出棧
					else
						w.Push(s[i]);   ///否則當前元素入棧
				}
				else
					w.Push(s[i]);   ///當前元素入棧
			}
			else if(s[i]=='}')   ///遇到右花括號和上面的同理
			{
				if(!w.empty())
				{
					if(w.GetTop()=='{')
						w.Pop();
					else
						w.Push(s[i]);
				}
				else
					w.Push(s[i]);
			}
			else if(s[i]==']')   ///遇到右方括號和上面的同理
			{
				if(!w.empty())
				{
					if(w.GetTop()=='[')
						w.Pop();
					else
						w.Push(s[i]);
				}
				else
					w.Push(s[i]);
			}
		}
		if(w.empty())   ///若遍歷完整個字串後,棧為空則說明匹配成功
			cout<<1<<endl;
		else
			cout<<0<<endl;   ///否則不成功
	}
	return 0;
}