9月9日算法学习(队列)

1.模版队列

描述:
请你实现一个队列。
操作:
push x:将 x x 加入队尾,保证 x x 为 int 型整数。
pop:输出队首,并让队首出队
front:输出队首:队首不出队

输入描述:
第一行为一个正整数 n n ,代表操作次数。(1≤n≤100000)(1≤n≤100000)
接下来的 n n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。

输出描述:
如果操作为push,则不输出任何东西。
如果为另外两种,若队列为空,则输出 "error“
否则按对应操作输出。

这个队列可以使用双项链表实现,先使用结构体来构造一个包含存值的int变量,然后在其中加入两个指针,一个指前一个指后,然后从字符串的后面开始遍历,用while提取出数据之后存储,到操作之后直接用等于等于,然后if else来进行处理。

#include <iostream>
#include <string>
using namespace std;
// 双向链表
typedef struct qNode {
    int value;
    qNode* next;
    qNode* pre;
    qNode(int a):value(a),next(nullptr),pre(nullptr){};
} ListNode;
 
int main() {
    ListNode* head = new ListNode(0);
    ListNode* tail = new ListNode(-1);
    head->next = tail;
    tail->pre = head;
 
    string op;
    int t = 0;
    cin>>t;
     
    while (t >= 0) {
        getline(cin, op);  
        int temp = 0;
        if(op.back() != 'p' && op.back() != 't' && op.back() != '\0'){
            int i = 1;   
            while(op.back() != ' '){
                temp = temp +  (op.back() - '0')*i;
                op.pop_back();
                i = i*10;
            } 
            op.pop_back();
        }
        if(op == "push"){ 
            ListNode* NewOne = new ListNode(temp);
            tail->pre->next = NewOne;
            NewOne->pre = tail->pre;
            NewOne->next = tail;
            tail->pre = NewOne;
        }else if (op == "front") { 
            if(head->next == tail){
                cout<<"error"<<endl;
            }else{
                cout<<head->next->value<<endl;
            }
        }else if (op == "pop") { 
            if(head->next == tail){
                cout<<"error"<<endl; 
            }else{
                cout<<head->next->value<<endl;
                head->next->next->pre = head;
                head->next = head->next->next;
            }
        }
        t--;
    }
}

2.循环队列

描述:
请你实现一个循环队列,该循环队列可利用的空间大小等于nn个int型变量的大小。

操作:
push x:将xx加入到循环队列尾端。若循环队列已满,输出"full"(不含引号),否则不输出任何内容。保证xx为int型整数。
front:输出队首元素,队首不出队。若队列为空,输出"empty"(不含引号)。
pop:输出队首元素,且队首出队。若队列为空,输出"empty"(不含引号)。

输入描述:
第一行输入两个整数n,qn,q (1≤n,q≤1051≤n,q≤105),表示循环队列可利用的空间大小和操作次数。
接下来的qq行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。
输出描述:
按对应操作要求输出。

这题可以使用双指针来实现,先用while来建立一个包含n+1个节点的队列,但是其中有一个是头结点,所以实际上空间还是n个,然后将最后一个节点的next连到头结点,就形成了循环链表,之后就是用来个指针是否相等来判断是否为空,进行一系列操作了。

#include <iostream>
#include <string>
using namespace std;

struct Node {
    int value = 0;
    Node* next = NULL;
};

int main() {
    int n, q;
    cin >> n >> q;
    Node* head = new Node;
    Node* f = head, *l = head;
    while (n--) {
        Node* temp = new Node;
        l->next = temp;
        l = l->next;
    }
    l->next = head;
    l = head;
    string s;
    int x;
    while (q--) {
        cin >> s;
        if (s == "push") {
            cin >> x;
            if (l->next ==f) 
                cout << "full" << endl;
            else {
                l = l->next;
                l->value = x;
            }
        } else if (s == "front") {
            if (f == l) 
                cout << "empty" << endl;
            else
                cout << f->next->value << endl;
        } else if (s == "pop") {
            if (f == l)
                cout << "empty" << endl;
            else {
                cout << f->next->value << endl;
                f = f->next;
            }
        }
    }
    return 0;
}

谢谢阅读!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值