zoukankan      html  css  js  c++  java
  • 循环队列和链式队列(C++实现)

    循环队列:

      1.循环队列中判断队空的方法是判断front==rear,队满的方法是判断front=(rear+1)%maxSize。(我曾经想过为什么不用一个length表示队长,当length==maxSize时队满)原因就是,在频繁的队列操作中,多出一个变量会大量的增加执行时间,所以不如浪费一个数组空间来得划算。

      2.用单链表表示的链式队列特别适合于数据元素变动较大的情形,而且不存在溢出的情况。

     1 template<class T>
     2 class SeqQueue{
     3     protected:
     4         T *element;
     5         int front,rear;
     6         int maxSize;
     7     public:
     8         SeqQueue(int sz=10){
     9             front=rear=0;
    10             maxSize=sz;
    11             element=new T[maxSize];
    12         }
    13         ~SeqQueue(){
    14             delete[] element;
    15         }
    16         bool EnQueue(const T& x){//入队 
    17             if(isFull()) return false;
    18             element[rear]=x;
    19             rear=(rear+1)%maxSize;
    20             return true;
    21         }
    22         bool DeQueue(T& x){//出队 
    23             if(isEmpty()) return false;
    24             x=element[front];
    25             front=(front+1)%maxSize;
    26             return true;
    27         }
    28         bool getFront(T& x){//获取队首元素 
    29             if(isEmpty()) return false;
    30             x=element[front];
    31             return true;
    32         }
    33         void makeEmpty(){//队列置空 
    34             front=rear=0;
    35         }
    36         bool isEmpty()const{//判断队列是否为空 
    37             return (rear==front)?true:false;
    38         }
    39         bool isFull()const{//队列是否为满
    40              return ((rear+1)%maxSize==front)?true:false;
    41         }
    42         int getSize()const{
    43             return (rear-front+maxSize)%maxSize;
    44         }
    45 }; 

    测试代码如下:

     1 void menu(){
     2     cout<<"1.入队"<<endl;
     3     cout<<"2.获取队首元素"<<endl;
     4     cout<<"3.出队"<<endl;
     5     cout<<"4.队列置空"<<endl;
     6     cout<<"5.获取队中元素数量"<<endl;
     7     cout<<"6.退出"<<endl;
     8 } 
     9 
    10 void function(int num,SeqQueue<int> *sq){
    11     switch(num){
    12         int x;
    13         case 1:
    14             cin>>x;
    15             sq->EnQueue(x);
    16             break;
    17         case 2:
    18             sq->getFront(x);
    19             cout<<x<<endl;
    20             break;
    21         case 3:
    22             sq->DeQueue(x);
    23             break;
    24         case 4:
    25             sq->makeEmpty();
    26             break;
    27         case 5:
    28             x=sq->getSize();
    29             cout<<x<<endl;
    30             break;    
    31         default:
    32             exit(1);
    33     }
    34 }
    35 int main(int argc, char** argv) {
    36     SeqQueue<int> *sq=new SeqQueue<int>;
    37     int num;
    38     while(true){
    39         menu();
    40         cin>>num;
    41         function(num,sq);
    42     } 
    43     delete sq;
    44     return 0; 
    45 }

    之后是链式队列,实现类代码和测试代码如下:

      1 #include <iostream>
      2 using namespace std;
      3 template<class T> 
      4 struct LinkNode{
      5     T data;
      6     LinkNode<T> *link;
      7     LinkNode(T& x,LinkNode<T> *l=NULL){
      8         data=x;
      9         link=l;
     10     }
     11 };
     12 template<class T>
     13 class LinkedQueue{
     14     protected:
     15         LinkNode<T> *front,*rear;
     16     public:
     17         LinkedQueue(){
     18             front=rear=NULL;
     19         }
     20         ~LinkedQueue(){
     21             makeEmpty();
     22         }
     23         bool enQueue(T& x){
     24             if(front==NULL)
     25                 front=rear=new LinkNode<T>(x);
     26             else{
     27                 rear=rear->link=new LinkNode<T>(x);
     28             }
     29             return true;
     30         }
     31         bool deQueue(T& x){
     32             if(isEmpty()) return false;
     33             LinkNode<T> *p=front;
     34             x=front->data;
     35             front=front->link;
     36             delete p;
     37             return true;
     38         }
     39         bool getFront(T& x)const{
     40             if(isEmpty()) return false;
     41             x=front->data;
     42             return true;
     43         }
     44         void makeEmpty(){
     45             LinkNode<T> *p;
     46             while(front!=NULL){
     47                 p=front;
     48                 front=front->link;
     49                 delete p;
     50             }
     51         }
     52         bool isEmpty()const{
     53             return (front==NULL)?true:false;
     54         }
     55         int getSize()const{
     56             LinkNode<T> *p;
     57             int count=0;
     58             p=front;
     59             while(p!=NULL){
     60                 count++;
     61                 p=p->link;
     62             } 
     63         return count;
     64         }
     65 }; 
     66 void menu(){
     67     cout<<"1.入队"<<endl;
     68     cout<<"2.获取队首元素"<<endl;
     69     cout<<"3.出队"<<endl;
     70     cout<<"4.队列置空"<<endl;
     71     cout<<"5.获取队中元素数量"<<endl;
     72     cout<<"6.退出"<<endl;
     73 } 
     74 
     75 void function(int num,LinkedQueue<int> *lq){
     76     switch(num){
     77         int x;
     78         case 1:
     79             cin>>x;
     80             lq->enQueue(x);
     81             break;
     82         case 2:
     83             lq->getFront(x);
     84             cout<<x<<endl;
     85             break;
     86         case 3:
     87             lq->deQueue(x);
     88             break;
     89         case 4:
     90             lq->makeEmpty();
     91             break;
     92         case 5:
     93             x=lq->getSize();
     94             cout<<x<<endl;
     95             break;    
     96         default:
     97             exit(1);
     98     }
     99 }
    100 int main(int argc, char** argv) {
    101     LinkedQueue<int> *lq=new LinkedQueue<int>;
    102     int num;
    103     while(true){
    104         menu();
    105         cin>>num;
    106         function(num,lq);
    107     } 
    108     delete lq;
    109     return 0; 
    110 }
  • 相关阅读:
    Zookeeper实现配置中心
    Springboot
    分布式事务框架
    Spring 事件Application Event
    了解“事务机制” 过程
    mysql : 行锁,表锁,共享锁,排他锁,悲观锁,乐观锁
    数据库隔离级别和实现原理
    aop用于日志
    exceptionHandler統一处理异常
    mysql 点总结
  • 原文地址:https://www.cnblogs.com/ytz1996/p/6339162.html
Copyright © 2011-2022 走看看