代码拉取完成,页面将自动刷新
/*符号配对*/
#include<iostream>
#include<string>
#include<stack>
#define ERROR -1;
using namespace std;
typedef int location;
bool signMatch(string str, stack<string>& stack,int &flag);//符号配对函数
location Find(string str[], string sub_str);
int main()
{
int flag = 0;//表示不匹配,但是缺少右符号的情况(不空栈)
stack<string> sign_stack;
string input_str;
string line_data;
string top_sign;
/*这里要了解getline()的终止符操作法-----可惜只能有一个终止符*/
/*getline(cin,str,'结束符号常量'),很可惜这里用不了*/
while (true)
{
getline(cin, line_data);
if (line_data == ".")
{
break;
}
input_str += line_data;
}
//output
if (signMatch(input_str, sign_stack,flag))
{
cout << "YES";
}
else//左符号多余的情况,符号栈不空
{
if (flag == 0)
{
cout << "NO" << endl;
top_sign = sign_stack.top();
cout << top_sign << "-?";
}
}
return 0;
}
bool signMatch(string str, stack<string>& stack, int& flag)
{
string cur_sign;
string temp_sign;//用来辅助处理 "/*"
int count_left = 0;//统计左符号的个数
int count_right = 0;//统计右符号的个数
string left_signs[4] = { "(","[","{", "/*" };//左符号表
string right_signs[4] = { ")","]","}", "*/" };//右符号表
for (int i = 0; i < str.size(); i++)
{
cur_sign = str[i];
/*以下是对遇到注释符号的特殊处理*/
if (str[i] == '/'
&& i + 1 < str.size()
&& str[i + 1] == '*')
{
temp_sign = str[i + 1];
cur_sign = cur_sign + temp_sign;
i++;//确保i+1位置的元素不会被重复利用
}
else if (str[i] == '*'
&& i + 1 < str.size()
&& str[i + 1] == '/')
{
temp_sign = str[i + 1];
cur_sign = cur_sign + temp_sign;
i++;//确保i+1位置的元素不会被重复利用
}
//如果当下的符号是左符号的话
if (Find(left_signs, cur_sign) == 0
|| Find(left_signs, cur_sign) == 1
|| Find(left_signs, cur_sign) == 2
|| Find(left_signs, cur_sign) == 3)
{
stack.push(cur_sign);
count_left++;
//左符号计数
}
//如果当下的符号是右符号的话
int n_right_loc = Find(right_signs, cur_sign);
if (n_right_loc == 0
|| n_right_loc == 1
|| n_right_loc == 2
|| n_right_loc == 3)
{
count_right++;
//右符号计数
if (!stack.empty())//不是空栈要考虑配对
{
/*先看一下栈顶是什么类型的左符号*/
int n_left_loc = Find(left_signs, stack.top());
if (n_left_loc == n_right_loc)//符号配对
{
stack.pop();
}
else//栈顶符号与当前右括号不配对的情况
{
return false;
}
}
else//是空栈直接配对失败
{
cout << "NO" << endl;
cout << "?-" << cur_sign;
flag = 1;//表示不匹配但是有缺少左符号的情况(空栈)
return false;
}
}
}
if (stack.empty())
{
return true;
}
else
{
return false;
}
}
location Find(string str[], string sub_str)
{
for (int i = 0; i < 4; i++)
{
if (str[i] == sub_str)
{
return i;
}
}
return ERROR;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。