C言語ソースプログラムの次の記号が一致するかどうかを確認するプログラムを作成してください:/ *と* /、(and)、[and]、{and}。
入力形式:
入力はC言語のソースプログラムです。ピリオドが1つだけで、特定の行にキャリッジリターンが1つある場合は、入力の終了を示します。プログラムでチェックする必要のあるシンボルは100個以下です。
出力形式:
まず、すべてのシンボルが正しくペアリングされている場合は、最初の行にYESを出力し、そうでない場合はNOを出力します。次に、2行目の最初の対になっていない記号を指摘します。左の記号がない場合は?-右の記号を出力し、右の記号がない場合は左の記号-?を出力します。
質問のアイデア:シンボルマッチングの問題を見て、スタックの使用を直接考慮して、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;
}