1 Star 0 Fork 0

骆谦实/PTA--博客作业相关题目集

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
PTA题目--7-3 符号配对 (20 分) 3.15 KB
一键复制 编辑 原始数据 按行查看 历史
骆谦实 提交于 2021-04-06 22:57 +08:00 . add PTA题目--7-3 符号配对 (20 分).
/*符号配对*/
#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;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/luoqianshi/linear-table-programming.git
git@gitee.com:luoqianshi/linear-table-programming.git
luoqianshi
linear-table-programming
PTA--博客作业相关题目集
master

搜索帮助