当前位置: 首页 > news >正文

学习总结三十三

括号序列

 如果它是一个右括号,考察它与它左侧离它最近未匹配的的左括号。如果该括号与之对应(即小括号匹配小括号,中括号匹配中括号),则将二者配对。简单理解,找到一个右括号,向左找一个左括号匹配,找不到就补齐。

思路:

1.输入一个字符串,对这个字符串从左到右扫描

2.如果碰到左括号,入栈(字符,字符所在位置--数组下标)

如果是右括号,与栈顶匹配

栈为空,跳过

匹配不上,跳过

如果匹配得上,出栈,将能匹配上的两个位置标记为1

3.再对字符串进行扫描,如果位置标记为已匹配,则输出原字符。反之补齐

#include<iostream>
#include<string>
#include<stack>
using namespace std;
struct point {
	char c;
	int pos;
};
int main()
{
	string s;
	stack<point> ps;
	bool mark[110] = {0};
	cin >> s;
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == '(' || s[i] == '[') {
			ps.push({ s[i],i });
			continue;
		}
		if (ps.empty())continue;
		point p = ps.top();
		if ((s[i] == ')' && p.c == '(') || (s[i] == ']' && p.c == '['))
		{
			mark[i] = 1;
			mark[p.pos] = 1;
			ps.pop();
		}
		for (int i = 0; i < s.size(); i++)
		{
			if (mark[i] == 1)cout << s[i];
			else if (s[i] == '(' || s[i] == ')')cout << "()";
			else cout << "[]";
		}
	}
	return 0;
}

10分。。。

最终代码:
 

#include<iostream>
#include<string>
#include<stack>
#include<vector>
#include<utility>
using namespace std;

int main()
{
	string s;
	cin >> s;
	stack<pair<char, int>> sta;//定义一个栈,存储字符和索引
	vector<int>mark(s.size(), 0);//定义一个向量,用于标记括号是否匹配,初始化为0
	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] == ')') {
			if (!sta.empty() && sta.top().first == '(') {  //栈不为空且栈顶字符为"("
				mark[sta.top().second] = 1;//标记栈顶字符对应的括号为匹配
				mark[i] = 1;//标记当前对应字符对应的括号为匹配
				sta.pop();
			}
		}
		else if (s[i] == ']') {
			if (!sta.empty() && sta.top().first == '[') {
				mark[sta.top().second] = 1;
				mark[i] = 1;
				sta.pop();
			}
		}
		else sta.push({ s[i],i });//都不是右括号,则压入栈中
	}
	for (int i = 0; i < s.size(); i++)
	{
		if (mark[i] == 0)//没有匹配上的
		{
			switch (s[i]) //根据字符类型补齐
			{
			case '(':cout << "()"; break;
			case ')':cout << "()"; break;
			case '[':cout << "[]"; break;
			case ']':cout << "[]"; break;
			}
		}
		else cout << s[i];
	}
	return 0;
}

pair:通俗来说就是一个结构体。代码中可以写成:

struct point {
	char c;
	int pos;
};

first-->c    second--->pos    就是这样。

相关文章:

  • 如果需要保护多个域名怎么办?
  • 基于C++实现的(控制台)植物大战僵尸游戏(高级程序设计)
  • 大预言模型|微调大预言模型初探索(LLaMA-Factory)(1)
  • Centos7安装Clickhouse单节点部署
  • 深度整理总结MySQL——Expalin指南(一)
  • 域森林基础及环境搭建
  • 美颜SDK技术深度解析:从滤镜算法到实时渲染优化
  • qt 事件的传递顺序
  • python学opencv|读取图像(六十六)使用cv2.minEnclosingCircle函数实现图像轮廓圆形标注
  • 《战神:诸神黄昏》游戏闪退后提示弹窗“d3dx9_43.dll缺失”“找不到d3dx11_43.d”该怎么处理?
  • Visual Studio Code支持WSL,直接修改linux/ubuntu中的文件
  • git 沙盒 下(二)
  • kong插件详解之Basic Authentication
  • uni-app 学习(一)
  • 算法兵法全略(译文)
  • 图的表示:邻接表和邻接矩阵
  • android launcher拖动图标释放错位
  • 群体智能优化:粒子群算法(PSO)详解与实战
  • 工业物联网平台在设备远程运维中的应用
  • 小米 R3G 路由器刷机教程(Pandavan)
  • 《蛮好的人生》:为啥人人都爱这个不完美的“大女主”
  • 教育部基础教育教指委:稳步推进中小学人工智能通识教育
  • 成都锦江区一在建工地起火,致2人遇难1人受伤
  • 航行警告:渤海海峡黄海北部执行军事任务,禁止驶入
  • 肖峰读《从塞北到西域》︱拉铁摩尔的骆驼
  • 江西暴雨强对流明显,专家:落雨区高度重叠,地质灾害风险高