P1241 括号序列

样例补充

#输入
[)]

#输出
[()]

题解

#include<iostream>
#include<string>
using namespace std;
const int N = 2e5 + 9;
int stack[N],top=0;// 栈和栈顶
bool ok[N];//判断该字符是否被匹配,右括号" ] " 或者 " ) ",和离它最近的左括号是否匹配
string s;
int main() 
	cin >> s;
	for (int i = 0; i < s.length(); i++) {
		if (s[i] == '(' || s[i] == '[') {
			stack[++top] = i;//用一个栈来记录最右边的那一个左括号
		}
		else if (top) {// 栈不空的情况
			if (s[stack[top]] == '(' && s[i] == ')' || s[stack[top]] == '[' && s[i] == ']')
			{
				ok[i] = 1;
				ok[stack[top]] = 1;//两个配对的标记一下,输出的时候就原样输出

				top--;
			}
		}
	}
	//根据标记情况来输出
	for (int i = 0; i < s.length(); i++) {
		if (ok[i])  cout << s[i]; //如果是匹配的就原样输入
		else {//否则补齐
			if (s[i] == '[' || s[i] == ']') { cout << "[]"; }
			else {
				cout << "()";
			}
		}
	}
	return 0;
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法步骤: 1.初始化一个空栈; 2.从左到右遍历输入括号序列中的每个括号; 3.如果遇到左括号 (、[、{,则将其压入栈中; 4.如果遇到右括号 )、]、},则取出栈顶元素进行匹配; a.如果栈为空,则说明右括号比左括号多,返回错误; b.如果栈顶元素不是对应的左括号,返回错误; c.如果栈顶元素是对应的左括号,则将其弹出栈; 5.遍历完全部括号后,如果栈不为空,则说明左括号比右括号多,返回错误; 6.否则,返回正确。 代码如下(使用顺序栈): ```c++ #include <iostream> using namespace std; const int MAXSIZE = 100; // 栈的最大容量 typedef struct { char data[MAXSIZE]; int top; } SqStack; void InitStack(SqStack &S) { S.top = -1; } bool StackEmpty(SqStack S) { if (S.top == -1) return true; else return false; } bool Push(SqStack &S, char e) { if (S.top == MAXSIZE - 1) // 栈满 return false; S.top++; S.data[S.top] = e; return true; } bool Pop(SqStack &S, char &e) { if (S.top == -1) // 栈空 return false; e = S.data[S.top]; S.top--; return true; } bool Match(char left, char right) { // 判断左右括号是否匹配 if (left == '(' && right == ')') return true; else if (left == '[' && right == ']') return true; else if (left == '{' && right == '}') return true; else return false; } bool CheckBracket(char s[]) { SqStack S; InitStack(S); int i = 0; while (s[i] != '\0') { if (s[i] == '(' || s[i] == '[' || s[i] == '{') { // 左括号入栈 Push(S, s[i]); } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 右括号出栈并判断是否匹配 char e; if (Pop(S, e) == false || Match(e, s[i]) == false) return false; } i++; } if (StackEmpty(S) == true) return true; else return false; } int main() { char s[] = "[(1+2)*(3-4)]"; if (CheckBracket(s) == true) cout << "括号匹配" << endl; else cout << "括号不匹配" << endl; return 0; } ``` 代码如下(使用链栈): ```c++ #include <iostream> using namespace std; typedef struct LinkNode { char data; struct LinkNode *next; } *LiStack; void InitStack(LiStack &S) { S = NULL; } bool StackEmpty(LiStack S) { if (S == NULL) return true; else return false; } bool Push(LiStack &S, char e) { LinkNode *p = new LinkNode; p->data = e; p->next = S; S = p; return true; } bool Pop(LiStack &S, char &e) { if (S == NULL) // 栈空 return false; e = S->data; LinkNode *p = S; S = S->next; delete p; return true; } bool Match(char left, char right) { // 判断左右括号是否匹配 if (left == '(' && right == ')') return true; else if (left == '[' && right == ']') return true; else if (left == '{' && right == '}') return true; else return false; } bool CheckBracket(char s[]) { LiStack S; InitStack(S); int i = 0; while (s[i] != '\0') { if (s[i] == '(' || s[i] == '[' || s[i] == '{') { // 左括号入栈 Push(S, s[i]); } else if (s[i] == ')' || s[i] == ']' || s[i] == '}') { // 右括号出栈并判断是否匹配 char e; if (Pop(S, e) == false || Match(e, s[i]) == false) return false; } i++; } if (StackEmpty(S) == true) return true; else return false; } int main() { char s[] = "[(1+2)*(3-4)]"; if (CheckBracket(s) == true) cout << "括号匹配" << endl; else cout << "括号不匹配" << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值