1. /* 
  2.  * queue.cpp 
  3.  * 
  4.  *  Created on: 2012-5-13 
  5.  *      Author: awind 
  6.  *      队列的链式表示 
  7.  */ 
  8.  
  9.  
  10. #include <iostream> 
  11. #include <cstdlib> 
  12.  
  13. using namespace std; 
  14.  
  15. typedef struct QNode{ 
  16.     int data; 
  17.     struct QNode *next; 
  18. }QNode,*QueuePtr; 
  19.  
  20. typedef struct
  21.     QueuePtr front; //队头指针 
  22.     QueuePtr rear;  //队尾指针 
  23. }LinkQueue; 
  24.  
  25. bool InitQueue(LinkQueue &Q) //创建一个空队列 
  26.     Q.front=Q.rear=new QNode; 
  27.     if(!Q.front) 
  28.         return false
  29.     Q.front->next=NULL; 
  30.     return true
  31.  
  32. bool DestroyQueue(LinkQueue &Q)  //销毁队列 
  33.     while(Q.front){ 
  34.         Q.rear=Q.front->next; 
  35.         delete Q.front; 
  36.         Q.front=Q.rear; 
  37.     } 
  38.     return true
  39.  
  40. bool EnQueue(LinkQueue &Q,int e) //插入元素为e的新的队尾元素 
  41.     QNode *p=new QNode; 
  42.     if(!p) 
  43.         return false
  44.     p->data=e; 
  45.     p->next=NULL; 
  46.     Q.rear->next=p;  //尾指针指向插入的元素 
  47.     Q.rear=p;   //插入的元素成为尾指针 
  48.     return true
  49.  
  50.  
  51. bool DeQueue(LinkQueue &Q,int &e)  //若队列不为空,则删除Q的队头元素 
  52.     if(Q.front==Q.rear) 
  53.         return false
  54.     QNode *p=new QNode; 
  55.     p=Q.front->next; 
  56.     e=p->data; 
  57.     Q.front->next=p->next; 
  58.     if(Q.rear==p) 
  59.         Q.rear=Q.front; 
  60.     delete p; 
  61.     return true
  62.  
  63. bool QueueEmpty(LinkQueue Q)  //队列是否为空 
  64.     return Q.front==Q.rear; 
  65.  
  66. bool ClearQueue(LinkQueue &Q)  //将队列清空 
  67.     QNode *p=new QNode; 
  68.     p=Q.front->next; 
  69.  
  70.     while(p) 
  71.     { 
  72.         Q.rear=p->next; 
  73.         delete p; 
  74.         p=Q.rear; 
  75.     } 
  76.     Q.rear=Q.front; 
  77.     Q.front->next=NULL; 
  78.     return true
  79.  
  80. int QueueLength(LinkQueue Q) //返回队列的长度 
  81.     int count=0; 
  82.     if(Q.front==Q.rear) 
  83.         return 0; 
  84.  
  85.     QNode *p=new QNode; 
  86.     p=Q.front->next; 
  87.     while(p) 
  88.     { 
  89.         ++count; 
  90.         p=p->next; 
  91.     } 
  92.     return count; 
  93.  
  94.  
  95. bool GetHead(LinkQueue Q,int &e)  //若队列不为空 则用e返回Q的队头元素 
  96.     if(Q.front==Q.rear) 
  97.         return false
  98.     e=Q.front->next->data; 
  99.     return true
  100.  
  101. bool QueueTraverse(LinkQueue Q) 
  102.     if(Q.front==Q.rear) 
  103.         return false
  104.     QNode *p=new QNode; 
  105.     p=Q.front->next; 
  106.     while(p) 
  107.     { 
  108.         cout<<p->data<<" "
  109.         p=p->next; 
  110.     } 
  111.     return true
  112.  
  113.  
  114. int main() 
  115.     LinkQueue Q; 
  116.     InitQueue(Q); 
  117.     cout<<"input the num of the Queue: "
  118.  
  119.     int stackNum; 
  120.     cin>>stackNum; 
  121.     for(int i=0;i<stackNum;i++) 
  122.     { 
  123.         int elem; 
  124.         cout<<"input the element of the stack: "
  125.         cin>>elem; 
  126.         EnQueue(Q,elem); 
  127.     } 
  128.  
  129.     QueueTraverse(Q); 
  130.     cout<<"\n"
  131.     cout<<"the length of the Queue: "<<QueueLength(Q)<<endl; 
  132.  
  133.     ClearQueue(Q); 
  134.  
  135.  
  136.     cout<<"input the num of the Queue: "
  137.  
  138.  
  139.         cin>>stackNum; 
  140.         for(int i=0;i<stackNum;i++) 
  141.         { 
  142.             int elem; 
  143.             cout<<"input the element of the stack: "
  144.             cin>>elem; 
  145.             EnQueue(Q,elem); 
  146.         } 
  147.  
  148.         QueueTraverse(Q); 
  149.         cout<<"\n"
  150.         cout<<"the length of the Queue: "<<QueueLength(Q)<<endl; 
  151.  
  152.     }