栈的应用

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;
}

 

以上是关于栈的应用的主要内容,如果未能解决你的问题,请参考以下文章

第三章:2.栈和队列 -- 栈的应用举例

栈的应用(Boolan)

栈的链式存储结构及应用(CJava代码)

算法与数据结构--栈的应用-逆波兰计算器完整版代码

Android Fragment 回栈的问题

C/C++语言数据结构快速入门(代码解析+内容解析)栈的应用