括号匹配问题,用栈实现


括号匹配问题,用栈实现

用栈实现括号匹配其实是一个很简单的问题,思路在代码注释里面写的很清楚了,只是接口设置的好像不太好。

如果在main里面设置的str不是动态分布的,在linux下就会出错,不知道windows会不会出问题。

kuohao.cpp

#include <iostream>
#include "stack.cpp"
using namespace std;
//仅用于检测(),{},[],其他的符号原理都是一样的
bool isCase(const char c1,const char c2)//用于判断两个符号是否是匹配的
{
	char ch1=c1;
	char ch2=c2;
	if(ch1=='('&&ch2==')')//for ()
		return true;
	if(ch1=='['&&ch2==']')//for []
		return true;
	if(ch1=='{'&&ch2=='}')//for {}
		return true;
	return false;//其他的都返回false

};
bool rightCase(const char c)//判断是否是右边的符号
{
	char ch=c;
	if(c==')'||c==']'||c=='}')
		return true;
	return false;

};
bool  match(char *m)//m为待测字符串
{
	mStack<char> ma;
	char ch;
	char *p=m;
	char top;//=*p;//栈顶符号,top总是指向最急需匹配的项,即栈顶元素,先随便指定一个top,但不能是左边的符号
			//top并不就是栈顶,而是栈顶的一个副本
	while(*p!='\0')//字符串未结束
	{
		
		ch=*p;//获取p里面的元素
		if(rightCase(ch))//检测是否是右边元素,是则与top进行匹配检测,否则入栈,top换成ch
		{	
			if(ma.isEmpty())//如果栈为空,并且此时是右元素
				return false;
			if(isCase(top,ch))//否则进行匹配检查,若匹配,则top换成此时栈顶元素,
			{
				char temp;
				ma.Pop(temp);//temp其实就是之前的栈顶元素
				if(!ma.isEmpty())//如果取出一个元素之后,栈非空
				{
					ma.Pop(top);//令top复制现在的栈顶元素,因为此时栈顶被删除了,所以又要放回去
					ma.Push(top);//这样,top又和栈顶元素值一样了
				}//否则什么也不做,此时的top将会由下一个入栈的值重置
				
			}
			else	//倘若不匹配,则表明该序列不是匹配,因为最需匹配的项都无法匹配,不可能是匹配的
			 	return false;
		}	
		else	//不是右边符号,则入栈,并变更top
		{
			top=ch;//换top//如果上一次出栈操作导致栈空了,top将在这里被重置
			ma.Push(ch);//ch入栈
		}
		p++;
		
	}
	if(ma.isEmpty())
		return true;
	return false;
};



	

main.cpp

#include "kuohao.cpp"
int main()
{
	//char *c[100];
	
	int i=5;
	while(i--)
	{
		char *str=new char[100];
		cout<<"please input the char **:";
		cin.getline(str,100);
		//cin.getline(c,100);
		cout<<str<<endl;
		//cout<<c<<endl;
		
		if(match(str))
			cout<<"this is match!"<<endl;
		else
			cout<<"doen't match!"<<endl;	
//		match(c);
		//cin.get();
		delete str;
	}
	
	
	return 0;
}

stack.cpp

//用于实现栈的操作
#include <iostream>
using namespace std;
//const int MAX=100;//栈最大长度值为100,用数组实现栈
//写成模板类是为了方便我以后使用
template <class T>
class mStack{
	private:
		enum {MAX=100};
		T arr[MAX];
		int Size;
		int top;//用于指示栈顶位置
	public:
		mStack(	)//构建空栈
		{
		  top=-1;//下标为-1则为空栈
		  Size=0;
		}
		bool isEmpty()
		{
			return top==-1;
		}
		bool isFull()
		{
			return top==MAX-1;
		}
		bool Push(T &item)
		{
			if(isFull())
			{
				cout<<"stack is full!"<<endl;
				return false;
			}
			//++top;
			//arr[++top]=item;
			arr[++top]=item;//因为下标从-1开始,使用前+1
			//cout<<"this "<<top<<" item push values is :"<<arr[top]<<endl;
			Size++;
			return true;
		}
		bool Pop(T &item)
		{
			if(isEmpty())
			{
				cout<<"stack is empty!"<<endl;
				return false;
			}
			item=arr[top--];//因为下标从-1开始,top指向当前最后一个元素,使用后-1
			//cout<<"this "<<top<<" item pop values is :"<<arr[top]<<endl;
			Size--;
			return true;
		}
		int size()
		{
			return Size;
		}

};

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注