c++:不使用STL标准模板库,实现双端队列

c++:不使用STL标准模板库,实现双端队列

0.简介

最近一个实验验收要求不调用STL标准模板库(standard template library)用c++或c实现双端队列。那么如果使用标准模板库的话怎么实现呢?只需头文件包含deque,然后在代码中直接定义即可,定义参考 deque< int > Name;(上一篇博客已经提到过)。
不用stl直接实现的话也很简单,没有太多算法上的难度,只是稍微有一点繁琐。

1.怎么写

1.1思路

大概思路:
1.首先建立一个循环队列,采用宏定义定义NUM表示循环队列最多容纳的数据个数,也方便修改
2.根据简单算法类比双端队列的功能实现相应的功能,最终达到不采用stl实现双端队列的要求

1.2代码

下面上代码,

#include<iostream>
#include<stdlib.h>
#include<windows.h>
#include<vector>
#include<iomanip>
#include<stdlib.h>
#include<string>
#include<math.h>
//#include<deque>//deque's headfile
using namespace std;
#define NUM 12 //零号单元不用,为判定双端队列是否已满,规定
              // 若front指针==back指针或者front指针在back
              //指针后一位是判定为队列已满。因此总体来说实际
              //空间为NUM - 2.注意!
#define Elemtype int  //可更改元素类型
//--------------循环队列-----------
typedef struct deQueue
{
    Elemtype *base;
    int front;
    int back;
} deQueue;
void init(deQueue &Q)
{
    Q.base = (Elemtype *)malloc(sizeof(Elemtype) * NUM);
    Q.back = Q.front = 1;//0号不用,判断队列是否满更方便
}
//------------队列功能函数-------------
//这部分算法都很简单,就不详细写了

//队首添加
int push_front(deQueue &Q, int x)
{
    if(Q.front < Q.back)
        if(Q.front == 1)
            if(Q.back == NUM - 1)  return 1;//满
            else {
                Q.front = NUM - 1;
                Q.base[Q.front] = x;
            }
    else if(Q.front == Q.back)
        if(Q.front == 1) {
            Q.front = NUM - 1;
            Q.base[Q.front] = x;
        }
        else {
            --Q.front;
            Q.base[Q.front] = x;
        }
    else 
    	if(Q.front == Q.back + 1) //判断是否满
            return 1;//满
        else {
            --Q.front;
            Q.base[Q.front] = x;
        }
    }
    return 0;
}

//队尾添加
int push_back(deQueue &Q, int x)
{
    if(Q.front == Q.back)
        if(Q.back == NUM - 1) {
            Q.base[Q.back] = x;
            Q.back = 1;
        }
        else
            Q.base[Q.back++] = x;
    else if(Q.front < Q.back)
        if(Q.back == NUM - 1)
            if(Q.front == 1) return 1;//满
            else {
                Q.back = 1;
                Q.base[Q.back] = x;
            }
        else  Q.base[Q.back++] = x;

    else
        if(Q.back + 1 == Q.front) return 1;//已满
        else Q.base[Q.back++] = x;
    return 0;
}

//弹出队首
int pop_front(deQueue &Q)
{
    if(Q.front == Q.back) return 1;//空
    else if(Q.front < Q.back) ++Q.front;
    else
        if(Q.front == NUM - 1) Q.front = 1;
        else ++Q.front;
    return 0;
}

//弹出队尾
int pop_back(deQueue &Q)
{
    if(Q.back > Q.front) --Q.back;
    else if(Q.back == Q.front) return 1;//已空
    else
        if(Q.back == 1) Q.back = NUM - 1;
        else --Q.back;
    return 0;
}

//打印
void print_queue(deQueue &Q)
{
    int n;
    if(Q.front == Q.back) {
        cout << "empty!" << endl;
        return;
    }
    else if(Q.front < Q.back) {
        cout << "队列内容为: " << endl;
        for (n = Q.front; n < Q.back; ++n)
        {
            cout << Q.base[n] << " ";
        }
        cout << endl;
    }
    else {
        cout << "队列内容为: " << endl;
        for (n = Q.front; n < NUM; ++n) cout << Q.base[n] << " ";
        for (n = 1; n < Q.back; ++n) cout << Q.base[n] << " ";
        cout << endl;
    }
}

int main()
{
    deQueue Q;
    init(Q);//初始化
    int choose;
    // int data;
    cout << "输入1在队首加入元素" << endl
         << "输入2在队尾加入元素" << endl
         << "输入3在队首删除元素" << endl
         << "输入4在队尾删除元素" << endl
         << "输入5退出" << endl;
    while(1)
    {
        cin >> choose;
        switch(choose)
        {
            case 1:
                cout << "要在队首添加一个23之后的队列为:" << endl;
                // cin >> data;
                if(push_front(Q, 23) == 1)
                    cout << "队列已满!" << endl;
                print_queue(Q);
                break;
            case 2:
                cout << "要在队尾添加一个12之后的队列为:" << endl;
                // cin >> data;
                if(push_back(Q, 12) == 1)
                    cout << "队列已满!" << endl;
                print_queue(Q);
                break;
            case 3:
                cout << "删除队首元素后的队列为:" << endl;
                pop_front(Q) == 1;
                print_queue(Q);
                break;
            case 4:
                cout << "删除队尾元素后的队列为:" << endl;
                pop_back(Q) == 1;
                print_queue(Q);
                break;
            default:
                goto loop;//退出程序
        }
    }
    loop:
    system("pause");
    return 0;
}

2.结尾

今天就到这里,希望明天能够验收成功!
结尾箴言:越努力,越幸运!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值