写过括号匹配这种题就很容易想到用栈来解决此类问题
首先要理解栈是什么,它是一种线性表
你可以将它理解为一个容器 但他只能从栈顶出,栈顶入,后进先出
实际定义(来自百度百科):栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
头文件:#include<stack>
定义:stack<类型(例如int)>a
删除栈顶元素:a.pop()
入栈:a.push(元素)
返回栈顶元素:a.top()
元素数量:a.size()
判断栈是否为空:a.empty() 是的话,返回一
两个大的气泡会消失,直接就a.pop()
但要注意栈为空就无法匹配 两个小气泡会组成一个大气泡,此时我们就要匹配之前是否存在大气泡
如果你觉得有所提升,练习下这道题https://ac.nowcoder.com/acm/contest/3005/B</stack>
#include<bits/stdc++.h>
using namespace std;
char b[107];
char c[107];
stack<char>a;
int main()
{
while(EOF!=scanf("%s",b))
{
int n=strlen(b);
for (int i=0;i<n;++i)
{
if (a.empty())///如果为空直接入栈无法匹配
{
a.push(b[i]);
}
else if (a.top()==b[i])
{
if (a.top()=='o')///同为小气泡
{
a.pop();
if (a.size()&&a.top()=='O')///融合为大气泡时如果前面存在大气泡,出栈
{
a.pop();
}
else
{
a.push('O');///不存在就直接入栈大的
}
}
else if (a.top()=='O')
{
a.pop();
}
}
else
{
a.push(b[i]);
}
}
int h=0;
while (!a.empty())
{
c[h++]=a.top();
a.pop();
}
for (int i=h-1;i>=0;--i)
{
printf("%c",c[i]);
}
cout<<endl;
}
return 0;
}
括号匹配代码实现
#include <bits/stdc++.h>
#define ll int
using namespace std;
const int maxn=1000010;
char s[maxn];
int main()
{
scanf("%s",s);///输入字符串
ll len=strlen(s);///字符串长度
stack<char>p;///stl中的栈
char tmp;
for (int i=0;i<len;++i)
{
if (p.empty())///最先一个元素直接入栈
{
p.push(s[i]);
}
else
{
tmp=p.top();///直接取栈顶的括号,如果有相同的括号与其匹配
if (tmp=='['&&s[i]==']'||tmp=='('&&s[i]==')'||tmp=='{'&&s[i]=='}')
{
p.pop();///直接删除匹配到的括号
}
else p.push(s[i]);///如果没有匹配项直接放到栈顶
}
}
if(p.empty())///全部消除完毕
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
return 0;
}



京公网安备 11010502036488号