第三章 栈与队列 练习题

链接:http://dsalgo.openjudge.cn/stackqueue/1/
来源:数据结构与算法MOOC

1:用队列对扑克牌排序

#include<bits/stdc++.h>
using namespace std;

queue<string>qnum[10];
queue<string>q[5];

int main(){
    int n;
    cin>>n;
    string str[1000];
    for(int i=1;i<=n;i++)
        cin>>str[i];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=9;j++){
            if(str[i][1]-'0'==j)
                qnum[j].push(str[i]);
        }
    }
    int k=0;
    for(int i=1;i<=9;i++){
        cout<<"Queue"<<i<<":";
        if(qnum[i].empty()) cout<<endl;
        while(!qnum[i].empty()){
            str[++k]=qnum[i].front();
            cout<<qnum[i].front();
            if(qnum[i].size()==1) cout<<endl;
            else cout<<" ";
            qnum[i].pop();
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=4;j++){
            if(str[i][0]==(char)(j-1+'A'))
                q[j].push(str[i]);
        }
    }
    k=0;
    for(int i=1;i<=4;i++){
        cout<<"Queue"<<(char)(i-1+'A')<<":";
        if(q[i].empty()) cout<<endl;
        while(!q[i].empty()){
            str[++k]=q[i].front();
            cout<<q[i].front();
            if(q[i].size()==1) cout<<endl;
            else cout<<" ";
            q[i].pop();
        }
    }
    for(int i=1;i<n;i++)
        cout<<str[i]<<" ";
    cout<<str[n]<<endl;
	return 0;
}

2:栈的基本操作

注意点:出现栈空的情况依然要输入。最后在输出error

#include<bits/stdc++.h>
using namespace std;

const int Max_n=300;
int a[Max_n];

int main(){
    int T;
    cin>>T;
    while(T--){
        stack<int>s;
        bool flag=true;
        int n;
        cin>>n;
        while(n--){
            string str;
            cin>>str;
            if(str=="push"){
                int val;
                cin>>val;
                s.push(val);
            }else{
                if(s.empty()){
                    flag=false;
                }
                else{
                    s.pop();
                }
            }
        }
        if(flag){
            int cnt=0;
            while(!s.empty()){
                a[++cnt]=s.top();
                s.pop();
            }
            for(int i=cnt;i>=1;i--){
                cout<<a[i];
                if(i==1) cout<<endl;
                else cout<<" ";
            }
        }else cout<<"error"<<endl;
    }
	return 0;
}

3:stack or queue

直接判断这组数据是不是按照栈的方式出入即可。

#include<bits/stdc++.h>
using namespace std;

const int Max_n=300;
int a[Max_n];

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        stack<int>s;
        int n;
        scanf("%d",&n);
        bool flag=true;
        int flag1;
        while(n--){
             int type,val;
             scanf("%d%d",&type,&val);
             if(type==1){
                s.push(val);
                flag1=val;
             }else{
                if(flag1!=val){
                    flag=false;
                    s.pop();
                    if(s.size())
                        flag1=s.top();
                }else{
                    s.pop();
                    if(s.size())
                        flag1=s.top();
                }
             }
        }
        if(flag) printf("Stack\n");
        else printf("Queue\n");
    }
	return 0;
}

4:双端队列

#include<bits/stdc++.h>
using namespace std;

const int Max_n=1e6+10;
int a[Max_n];
bool flag[Max_n];

deque<int>d;

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int type,val;
            scanf("%d%d",&type,&val);
            if(type==1)
                d.push_back(val);
            else{
                if(val) d.pop_back();
                else d.pop_front();
            }
        }
        if(!d.size()) printf("NULL\n");
        while(d.size()){
            printf("%d%c",d.front(),d.size()==1?'\n':' ');
            d.pop_front();
        }
    }
	return 0;
}

5:等价表达式

方法一:多项式相减,判断最终结果是零还是非零
方法二:将中缀表达式转换成后缀表达式,然后各自计算结果,最后判断两个结果是否相等

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;

typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=1e6+10;
char a[Max_n],b[Max_n],str[Max_n];

void change(char a[]){
    stack<char>s;
    int cnt=0;
    int n=strlen(a);
    for(int i=0;i<n;i++){
        if(a[i]=='+'||a[i]=='-'){
            while(!s.empty()&&s.top()!='('){
                str[cnt++]=s.top();
                s.pop();
            }
            s.push(a[i]);
        }else if(a[i]=='*'){
            while(!s.empty()&&s.top()!='('&&s.top()=='*'){
                    str[cnt++]=s.top();
                    s.pop();
            }
            s.push(a[i]);
        }else if(a[i]=='('){
            s.push(a[i]);
        }else if(a[i]==')'){
            while(s.top()!='('){
                str[cnt++]=s.top();
                s.pop();
            }
            s.pop();
        }else if(a[i]=='\t'||a[i]==' '){
                continue;
        }else{
            str[cnt++]=a[i];
        }
    }
    while(!s.empty()){
        str[cnt++]=s.top();
        s.pop();
    }
}

void init(){
    for(int i=0;i<=Max_n;i++)
        str[i]='\0';
}

int cal(char val[]){
    stack<ll>s;
    int lenval=strlen(val);
    for(int i=0;i<lenval;i++){
        ll temp;
        if(val[i]=='+'){
            temp=s.top();s.pop();
            temp+=s.top();s.pop();
            s.push(temp);
        }else if(val[i]=='-'){
            temp=s.top();s.pop();
            temp-=s.top();s.pop();
            s.push(-temp);
        }else if(val[i]=='*'){
            temp=s.top();s.pop();
            temp*=s.top();s.pop();
            s.push(temp);
        }else{
            if(val[i]<='9'&&val[i]>='0') s.push(val[i]-'0');
            else s.push((int)val[i]);
            //if(val[i]<='z'&&val[i]>='a') s.push(val[i]-'a'+1);
            //if(val[i]<='Z'&&val[i]>='A') s.push(val[i]-'A'+1);
        }
    }
    ll ans=s.top();s.pop();
    return ans;
}

int main(){
    int n;
    scanf("%d",&n);getchar();
    while(n--){
        cin.getline(a,Max_n-1,'\n');
        cin.getline(b,Max_n-1,'\n');
        init();change(a);
        char stra[Max_n],strb[Max_n];
        int len=strlen(str);
        for(int i=0;i<=len;i++)
            stra[i]=str[i];
        init();change(b);
        len=strlen(str);
        for(int i=0;i<=len;i++)
            strb[i]=str[i];
        //puts(stra);puts(strb);
        //printf("%d %d\n",cal(stra),cal(strb));
        if(cal(stra)==cal(strb)) printf("YES\n");
        else printf("NO\n");
    }
	return 0;
}

8:抓住那头牛

bfs,将三种可能的情况都放进队列中,找到最小的step即可。

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;

typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=1e6+10;
const int Max_m=100000;
bool vis[Max_n];

int n,k;

struct Node{
    int val,step;
    Node(){}
    Node(int val,int step):val(val),step(step){};
}node[Max_n];

queue<Node>q;

void bfs(int val,int step){
    vis[val]=true;q.push(Node(val,step));
    while(!q.empty()){
        Node node=q.front();q.pop();
        //cout<<node.val<<" "<<node.step<<endl;
        if(node.val==k){
            printf("%d\n",node.step);
            return;
        }
        if(!vis[node.val+1]&&node.val+1<=Max_m){
            vis[node.val+1]=true;
            q.push(Node(node.val+1,node.step+1));
        }
        if(!vis[node.val-1]&&node.val-1>=0){
            vis[node.val-1]=true;
            q.push(Node(node.val-1,node.step+1));
        }
        if(!vis[node.val*2]&&node.val*2<=Max_m){
            vis[node.val*2]=true;
            q.push(Node(node.val*2,node.step+1));
        }
    }
}

int main(){
    scanf("%d%d",&n,&k);
    memset(vis,false,sizeof(vis));
    bfs(n,0);
	return 0;
}

9:发型糟糕的一天

将每头牛能看到多少个转化为每头牛能够被看到多少次。

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;

typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=8e4+10;

stack<int>s;

int main(){
    int n;
    scanf("%d",&n);
    ll ans=0;
    while(n--){
        int val;
        scanf("%d",&val);
        ///将前面看不到这头牛的删除
        while(!s.empty()&&val>=s.top()) s.pop();
        ans+=s.size();
        s.push(val);
    }
    printf("%lld\n",ans);
	return 0;
}

10:括号画家

遇到匹配的就弹出

#include<bits/stdc++.h>
using namespace std;

const int Max_n=1e4+10;
char a[Max_n];

stack<char>s;

int main(){
    scanf("%s",a);
    int n=strlen(a);
    for(int i=0;i<n;i++){
        if(s.empty()){
            s.push(a[i]);
            continue;
        }
        if(a[i]=='}'&&s.top()=='{')
            s.pop();
        else if(a[i]==']'&&s.top()=='[')
            s.pop();
        else if(a[i]==')'&&s.top()=='(')
            s.pop();
        else
            s.push(a[i]);
    }
    if(s.empty()) printf("Yes\n");
    else printf("No\n");
	return 0;
}

11:机器翻译

不重复的先加进去k个,用vis标记这个数是否在队列中,按照题意更新队列。

#include<bits/stdc++.h>
using namespace std;

const int Max_n=1e6+10;
int a[Max_n];
bool flag[Max_n];

queue<int>q;

int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    memset(flag,false,sizeof(flag));
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int cnt=0;
    for(int i=1;i<=n;i++){
        if(flag[a[i]]) continue;
        cnt++;
        if(q.size()==m){
            flag[q.front()]=false;
            q.pop();
        }
        q.push(a[i]);
        flag[a[i]]=true;
    }
    printf("%d\n",cnt);
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值