习题3.8 符号配对 (20分)

本题利用堆栈性质处理
1)初始设置一个空栈,顺序读入括号
顺序遍历得出的chars_str(存储括号的string)
2)若是右括号,判断栈是否为空,若为空则NO,若栈顶此时括号与此右括号不相匹配,则NO,匹配则弹栈
3)若是左括号,直接压栈
4)若遍历完整个chars_str,stack不为空,则为NO,能走到这一步,栈顶元素必为某左括号;若stack为空,则为YES

注意:
(1)本程序中间有多个返回点(return 0)
(2)要对第一个错误的括号输出相应的错误信息,是一个烦点,程序对此问题的处理有加以注释

#include<iostream>
#include<stack>
#include<string>
#include<vector>
using namespace std;
int main()
{
	string chars_str="",cur_str;
	vector<string>vec;
	stack<char>my_stack;
	while (true)
	{
		/*将每行分别读入string向量vec*/
		getline(cin, cur_str);
		if (cur_str == ".")break;
		vec.push_back(cur_str);
	}
	for (int i = 0,j=0; i < vec.size(); i++,j=0)
	{
		/*将所有括号按序存入chars_str*/
		// 将"*/"、"/*"分别替换为'>'、'<'
		cur_str = vec[i];
		while (j < cur_str.length())
		{
			if (cur_str[j] == '(' || cur_str[j] == ')' || cur_str[j] == '[' || cur_str[j] == ']'|| cur_str[j] == '{'|| cur_str[j] == '}')chars_str += cur_str[j++];
			else if (cur_str[j] == '/' && j + 1 < cur_str.length() && cur_str[j + 1] == '*')
			{
				chars_str += '<';
				j += 2;
			}
			else if (cur_str[j] == '*' && j + 1 < cur_str.length() && cur_str[j + 1] == '/')
			{
				chars_str += '>';
				j += 2;
			}
			else j++;
		}
	}
	for (int i = 0; i < chars_str.length(); i++)
	{
		char cur_char = chars_str[i],c;
		if (cur_char == '{' || cur_char == '[' || cur_char == '(' || cur_char == '<')
		{
			my_stack.push(cur_char);
			continue;
		}
		switch (cur_char)
		{
		case']':
			if (!my_stack.empty() && my_stack.top() == '[') { my_stack.pop(); break; }
			else if (my_stack.empty())
			{
				cout << "NO" << endl << "?-]";
				return 0;
			}
			else
			{//找到第一个错误括号
				while (!my_stack.empty()&&my_stack.top() != '[')
				{
					c = my_stack.top();
					my_stack.pop();
				}
				if (!my_stack.empty())
				{
					if(c=='<')cout << "NO" << endl <<"/*-?";
					else cout << "NO" << endl << c << "-?";
				}
				return 0;
			}
		case')':
			if (!my_stack.empty() && my_stack.top() == '(') { my_stack.pop(); break; }
			else if (my_stack.empty())
			{
				cout << "NO" << endl << "?-)";
				return 0;
			}
			else
			{
				while (!my_stack.empty() && my_stack.top() != '(')
				{
					c = my_stack.top();
					my_stack.pop();
				}
				if (!my_stack.empty())
				{
					if (c == '<')cout << "NO" << endl << "/*-?";
					else cout << "NO" << endl << c << "-?";
				}
				return 0;
			}
		case'}':
			if (!my_stack.empty() && my_stack.top() == '{') { my_stack.pop(); break; }
			else if (my_stack.empty())
			{
				cout << "NO" << endl << "?-}";
				return 0;
			}
			else
			{
				while (!my_stack.empty() && my_stack.top() != '{')
				{
					c = my_stack.top();
					my_stack.pop();
				}
				if (!my_stack.empty())
				{
					if (c == '<')cout << "NO" << endl << "/*-?";
					else cout << "NO" << endl << c << "-?";
				}
				return 0;
			}
		case'>':
			if (!my_stack.empty() && my_stack.top() == '<') { my_stack.pop(); break; }
			else if (my_stack.empty())
			{
				cout << "NO" << endl << "?-*/";
				return 0;
			}
			else
			{
				while (!my_stack.empty() && my_stack.top() != '<')
				{
					c = my_stack.top();
					my_stack.pop();
				}
				if (!my_stack.empty())
				{
					if (c == '<')cout << "NO" << endl << "/*-?";
					else cout << "NO" << endl << c << "-?";
				}
				return 0;
			}
		}
	}
	if (my_stack.empty())
	{
		cout << "YES";
		return 0;
	}
	switch (my_stack.top())
	{
	case'[':cout <<"NO"<<endl<<"[-?"; break;
	case'(':cout << "NO" << endl << "(-?"; break;
	case'{':cout << "NO" << endl << "{-?"; break;
	case'<':cout << "NO" << endl << "/*-?"; break;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值