习题3.8 符号配对 (20 分)

请编写程序检查C语言源程序中下列符号是否配对:/* 与 */、(与)、[与]、{与}。

输入格式:
输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。

输出格式:
首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

题目思路:看到符号匹配问题,直接考虑到使用栈解决,可以使用C++里的< stack > 模板,(如果不懂STACK模板可以去自学一下)。上代码。

#include<iostream>
#include<stack>

using namespace std;
char t;
stack<char> st;

bool deal(stack<char>& st);	//注意,这里一定需要‘&’,否则在main里st是没有元素的
int main()
{
    
    
	if (deal(st))
		cout << "YES" << endl;
	else
	{
    
    
		
		if (st.empty())
		{
    
    
			switch (t)
			{
    
    
			case ')':cout << "NO\n?-)" << endl; break;
			case ']':cout << "NO\n?-]" << endl; break;
			case '}':cout << "NO\n?-}" << endl; break;
			case'*':cout << "NO\n?-*/" << endl; break;
			}
		}
		else
		{
    
    
			switch (st.top())
			{
    
    
			case '(': cout << "NO\n(-?" << endl; break;
			case '{': cout << "NO\n{-?" << endl; break;
			case '[': cout << "NO\n[-?" << endl; break;
			case '*': cout << "NO\n/*-?" << endl; break;
			}
		}
	}

	return 0;
}

bool deal(stack<char>& st)
{
    
    
	char c[101];
	bool flag = true;

	while (cin >> c)
	{
    
    
		if (c[0] == '.' && c[1] == '\0') break;

		for (int i = 0; c[i] != '\0'; i++)
		{
    
    
			if (c[i] == '/' && c[i + 1] == '*')
			{
    
    
				st.push(c[i]);
				st.push(c[i + 1]);
				i++;			

			}
			else if (c[i] == '{' || c[i] == '[' || c[i] == '(')
				st.push(c[i]);
			else if (c[i] == '*' && c[i + 1] == '/')
			{
    
    
				if (!st.empty() && st.top() == '*')
				{
    
    
					st.pop();
					if (!st.empty() && st.top() == '/')
						st.pop();
					else
					{
    
    
						flag = false;
						t = c[i];
						break;
					}
				}
				else
				{
    
    
					flag = false;
					t = c[i];
					break;
				}
			}
			else if (c[i] == ')')
			{
    
    
				if (!st.empty() && st.top() == '(')
					st.pop();
				else
				{
    
    
					flag = false;
					t = c[i];
					break;
				}
			}
			else if (c[i] == '}')
			{
    
    
				if (!st.empty() && st.top() == '{')
					st.pop();
				else
				{
    
    
					flag = false;
					t = c[i];
					break;
				}
			}
			else if (c[i] == ']')
			{
    
    
				if (!st.empty() && st.top() == '[')
					st.pop();
				else
				{
    
    
					flag = false;
					t = c[i];
					break;
				}
			}

		}

	}

	if (st.empty() && flag)
		return true;	
	else 
		return false;
}

猜你喜欢

转载自blog.csdn.net/xdg15294969271/article/details/113867014