请编写程序检查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;
}