zoukankan      html  css  js  c++  java
  • 常用数据结构之队列

    使用数组和链表实现两种队列结构

    class BaseQueue {
    public:
        typedef int Elemtype;
        virtual Elemtype front()=0;
        virtual void push(Elemtype)=0;
        virtual void pop()=0;
        virtual int size()=0;
        virtual bool empty()=0;
    };
    class ArrQueue: public BaseQueue {
    public:
        ArrQueue() {
            maxSize = 5;
            curnums = 0;
            elems = new Elemtype[maxSize];
            frontIndex = tailIndex = 0;
        }
        ~ArrQueue() {
            delete[] elems;
        }
        Elemtype front() {
            if (empty())
                return -1;
            return elems[frontIndex % maxSize];
        }
        void push(Elemtype e) {
            if (frontIndex == (tailIndex + 1) % maxSize)
                return;
            elems[tailIndex] = e;
            tailIndex = (tailIndex + 1) % maxSize;
            curnums++;
        }
        void pop() {
            if (empty())
                return;
            frontIndex = (frontIndex + 1) % maxSize;
            curnums--;
        }
        int size() {
            return curnums;
        }
        bool empty() {
            if (frontIndex == tailIndex)
                return true;
            else
                return false;
        }
    private:
        Elemtype *elems;
        int maxSize;
        int curnums;
        int frontIndex;
        int tailIndex;
    public:
        static void test() {
            ArrQueue a;
            a.push(1);
            a.push(2);
            a.push(3);
            a.push(4);
            cout << "size: " << a.size() << endl;
            while (!a.empty()) {
                cout << a.front() << " ";
                a.pop();
            }
            cout << endl;
            cout << "size: " << a.size() << endl;
        }
    };
    class ListQueue: public BaseQueue {
    public:
        struct ListNode {
            Elemtype val;
            ListNode *next;
            ListNode(Elemtype e) :
                    val(e), next(NULL) {
            }
        };
        ListQueue() {
            head = NULL;
            tail = NULL;
            curnums = 0;
        }
        ~ListQueue() {
            while (head) {
                ListNode *node = head;
                head = head->next;
                delete node;
            }
        }
        Elemtype front() {
            if (head == NULL)
                return -1;
            return head->val;
        }
        void push(Elemtype e) {
            ListNode *node = new ListNode(e);
            if (head == NULL) {
                head = node;
                tail = head;
            } else {
                tail->next = node;
                tail = tail->next;
            }
            curnums++;
        }
        void pop() {
            if (head == NULL)
                return;
            ListNode *node = head;
            head = head->next;
            delete node;
            curnums--;
        }
        int size() {
            return curnums;
        }
        bool empty() {
            if (head == NULL)
                return true;
            else
                return false;
        }
    private:
        ListNode *head;
        ListNode *tail;
        int curnums;
    
    public:
        static void test() {
            ListQueue a;
            a.push(1);
            a.push(2);
            a.push(3);
            a.push(4);
            cout << "size: " << a.size() << endl;
            while (!a.empty()) {
                cout << a.front() << " ";
                a.pop();
            }
            cout << endl;
            a.push(4);
            cout << "size: " << a.size() << endl;
        }
    };
  • 相关阅读:
    每日日报
    剑指 Offer 18. 删除链表的节点(LeetCode)
    java的访问权限
    java从键盘输入
    剑指 Offer 22. 链表中倒数第k个节点(快慢指针)(LeetCode)
    面试题 02.03. 删除中间节点(LeetCode)
    21. 合并两个有序链表(Leetcode)
    计算总线数据传输率
    时钟周期、总线周期(机器周期)区别
    书单(个人)
  • 原文地址:https://www.cnblogs.com/tla001/p/6702951.html
Copyright © 2011-2022 走看看