顺序队列以及链式队列的基本功能(题目为:PTA7-3(队列) 银行业务队列简单模拟 (25 分))

本文介绍了使用C++模板类实现顺序队列的方法,并详细展示了队列的基本操作如初始化、入队、判断空队列、获取队首元素、获取队列长度及出队等。此外,还提供了链式队列的实现,包括初始化、销毁、入队、获取队首元素、出队及判断空队列等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.顺序队列(c++模板类实现)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5 + 10;
template<typename T>
class Queue
{
private:
    int en;
    int be;
    T *base;
public:
    void Init()
    {
        be=en=0;
        base=new T[maxn];
    }
    void Push(T num)
    {
        base[en]=num;
        en=(en+1)%maxn;
    }
    int Empty()//此情况是在队列没有满的前提下
    {
        if(en==be)
            return 1;
        return 0;
    }
    T Front()
    {
        return base[be];
    }
    int Length()
    {
        return (en-be+maxn)%maxn;
    }
    void Pop()
    {
      be=(be+1)%maxn;
    }
};
int main()
{
    Queue<int> a;
    Queue<int> b;
    a.Init();
    b.Init();
    int t;
    int n;
    cin>>t;
    vector<int> ans;
    while(t--){
        cin>>n;
        if(n%2==1)
            a.Push(n);
        else
            b.Push(n);
      //      cout<<"aaaaaaa"<<endl;
    }
    //cout<<"--------------"<<endl;
    while(!a.Empty()&&!b.Empty())
    {
        if(!a.Empty())
        {
            ans.push_back(a.Front());
            a.Pop();
        }
        if(!a.Empty())
        {
            ans.push_back(a.Front());
            a.Pop();
        }
        if(!b.Empty())
        {
            ans.push_back(b.Front());
            b.Pop();
        }
    }
    while(!a.Empty())
    {
        ans.push_back(a.Front());
        a.Pop();
    }
    while(!b.Empty())
    {
        ans.push_back(b.Front());
        b.Pop();
    }
    for(int i=0;i<ans.size();i++)
    {
        if(i)
            cout<<" ";
        cout<<ans[i];
    }
    cout<<endl;
}

2.链式队列

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int maxn = 1e5;
typedef struct Qnode
{
    int data;
    struct Qnode *next;
}Qnode,*QnodePointer;
typedef struct ListQueue
{
    QnodePointer be;
    QnodePointer en;
}ListQueue;
void Init(ListQueue &L)
{
    L.be=(QnodePointer)malloc(sizeof(Qnode));
    L.en=L.be;
   // L.en=(QnodePointer)malloc(sizeof(Qnode));
    L.be->next=NULL;
}
void Destroy(ListQueue &L)
{
    while(L.be){
        QnodePointer p=L.be->next;
        free(L.be);
        L.be=p;
    }
}
void Push(ListQueue &L,int n)
{
    QnodePointer p=(QnodePointer)malloc(sizeof(Qnode));
    p->data=n;
    p->next=NULL;
    L.en->next=p;
    L.en=p;
}
int Front(ListQueue &L)
{
    return L.be->next->data;
}
void Pop(ListQueue& L)
{
    QnodePointer p=L.be->next;
    L.be->next=p->next;
    if(L.en==p)
        L.en=L.be;
    free(p);
}
int Empty(ListQueue &L)
{
    if(L.be==L.en)
    return 1;
    return 0;
}
int main()
{
     int t;
     int n;
     int ans[100010];
     ListQueue a;
     ListQueue b;
     Init(a);
     Init(b);
     scanf("%d",&t);
     //printf("--------------------\n");
     while(t--)
     {
         scanf("%d",&n);
         if(n%2){
            Push(a,n);
            //cout<<a.be->next->data<<" "<<a.en->data<<"aaaaaa"<<endl;
            }
         else{
            Push(b,n);
          //  cout<<b.be->next->data<<" "<<b.en->data<<"bbbbb"<<endl;
         }
     }
     //printf("---===============\n");
     int len=0;
     while(!Empty(a)&&!Empty(b))
        {
            if(!Empty(a))
            {
                ans[len++]=Front(a);
         //       cout<<ans[len-1]<<"hahahah"<<endl;
                Pop(a);
            }
            //if(Empty(a))
              //  cout<<"Empty A"<<endl;
            if(!Empty(a))
            {
                ans[len++]=Front(a);
                Pop(a);
            }
            if(!Empty(b))
            {
                ans[len++]=Front(b);
                Pop(b);
            }
       //     printf("ssjdksjdksjdksjdksjdksjdks]\n");
        }
        while(!Empty(a)){
            ans[len++]=Front(a);
            Pop(a);
        }
        while(!Empty(b))
        {
            ans[len++]=Front(b);
            Pop(b);
        }
        int i=0;
        //cout<<len<<"========="<<endl;
        for(i=0;i<len;i++)
        {
            if(i)
                printf(" ");
            printf("%d",ans[i]);
        }
        printf("\n");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值