吐泡泡
吐泡泡
http://www.nowcoder.com/questionTerminal/f86fa2221c094b3d8d1fc79bae450d96
写过括号匹配这种题就很容易想到用栈来解决此类问题
首先要理解栈是什么,它是一种线性表
你可以将它理解为一个容器 但他只能从栈顶出,栈顶入,后进先出
实际定义(来自百度百科):栈(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; }