栈的应用
Posted ljhaha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的应用相关的知识,希望对你有一定的参考价值。
括号匹配:
蒜头君在纸上写了一个串,只包含’(‘和’)’。一个’(‘能唯一匹配一个’)’,但是一个匹配的’(‘必须出现在’)’之前。请判断蒜头君写的字符串能否括号完全匹配,如果能,输出配对的括号的位置(匹配的括号不可以交叉,只能嵌套)。
输入格式
一行输入一个字符串只含有’(‘和’)’,输入的字符串长度不大于50000。
输出格式
如果输入括号不能匹配,输出一行”No”,否则输出一行”Yes”,接下里若干行每行输出 2 个整数,用空格隔开,表示所有匹配对的括号的位置(下标从 1 开始)。你可以按照任意顺序输出。
本题答案不唯一,符合要求的答案均正确
样例输入
()()
样例输出
Yes
1 2
3 4
#include<cstdio> #include<stack> #include<iostream> using namespace std; int ans[50000][2]; //用于存放与当前的“)”匹配的第一个“(” stack<int>s; int main() { char ch; int c1=0; int cnt=0; while(scanf("%c",&ch)&&ch!=10){ cnt++; if(ch==‘(‘){ s.push(cnt); } if(ch==‘)‘){ if(s.empty()){ cout<<"No"<<endl; return 0; } ans[c1][0]=s.top(); ans[c1][1]=cnt; c1++; s.pop(); } } if(s.empty()){ cout<<"Yes"<<endl; for(int i=0;i<c1;i++){ cout<<ans[i][0]<<" "<<ans[i][1]; if(i!=c1-1) cout<<endl; } }else cout<<"No"<<endl; return 0; }
网页跳转
题目:蒜头君每天都在用一款名为“蒜厂浏览器”的软件。在这个浏览器中,一共三种操作:打开页面、回退和前进。它们的功能如下:
打开页面:在地址栏中输入网址,并跳转到网址对应的页面;
回退:返回到上一次访问的页面;
前进:返回到上次回退前的页面,如果上一次操作是打开页面,那么将无法前进。
现在,蒜头君打开浏览器,进行了一系列操作,你需要输出他每次操作后所在页面的网址。
输入格式
第一行输入一个整数 n(0 < n 100000) ,表示蒜头君的操作次数。
接下来一共 nn 行,每行首先输入一个字符串,如果是VISIT,后面接着输入一个不含有空格和换行的网址(网址长度小于 100100),表示蒜头君在浏览器地址栏中输入的网址;如果是BACK,表示蒜头君点击了回退按钮;如果是FORWARD,表示蒜头君点击了前进按钮。
输出格式
对于每次操作,如果蒜头君能操作成功,输出蒜头君操作之后的网址,否则输出Ignore。假设蒜头君输入的所有网址都是合法的。
#include<cstdio> #include<iostream> #include<stack> using namespace std; stack<string>fo;//存放往前进的页面 stack<string>ba;//存放往后退的页面 int main() { int n; ios::sync_with_stdio(0); string ope,url,current; cin>>n; while(n--){ cin>>ope; if(ope.compare("VISIT")==0){ cin>>url; while(!fo.empty()) fo.pop(); ba.push(url); cout<<ba.top()<<endl; } else if(ope.compare("BACK")==0){ if(ba.empty()) cout<<"Ignore"<<endl; else{ fo.push(ba.top()); ba.pop(); if(!ba.empty()) cout<<ba.top()<<endl; else{ ba.push(fo.top()); fo.pop(); cout<<"Ignore"<<endl; } } }else{ if(fo.empty()) cout<<"Ignore"<<endl; else{ cout<<fo.top()<<endl; ba.push(fo.top()); fo.pop(); } } } return 0; }
以上是关于栈的应用的主要内容,如果未能解决你的问题,请参考以下文章