实验四:顺序队列(循环队列)和链队列

一、实验目的

熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。



二、实验过程

1.循环队列
#ifndef CirQueue_H  
#define CirQueue_H  
  
const int QueueSize=100;  //定义存储队列元素的数组的最大长度  
  
template 
    
    
     
             //定义模板类CirQueue  
class CirQueue  
{  
public:  
    CirQueue( );        //构造函数,置空队  
    ~ CirQueue( );               //析构函数  
    void EnQueue(DataType x);           //将元素x入队  
    DataType DeQueue( );                //将队头元素出队  
    DataType GetQueue( );               //取队头元素(并不删除)  
    int Empty( );               //判断队列是否为空  
private:  
    DataType data[QueueSize];           //存放队列元素的数组  
    int front, rear;    //队头和队尾指针,分别指向队头元素的前一个位置

和队尾元素的位置  
};  
  
#endif  


#include "CirQueue.h"  

template 
     
     
      
        
CirQueue
      
      
       
       ::CirQueue( )   
{  
    front=rear=QueueSize-1;  
}   

template 
       
       
        
          
CirQueue
        
        
          ::~CirQueue( ) { } template 
         
           void CirQueue 
          
            ::EnQueue(DataType x) { if ((rear+1) % QueueSize ==front) throw "上溢"; rear=(rear+1) % QueueSize; //队尾指针在循环意义下加1 data[rear]=x; //在队尾处插入元素 } template 
           
             DataType CirQueue 
            
              ::DeQueue( ) { if (rear==front) throw "下溢"; front=(front+1) % QueueSize; //队头指针在循环意义下加1 return data[front]; //读取并返回出队前的队头元素,注意 队头指针 } template 
             
               DataType CirQueue 
              
                ::GetQueue( ) { int i; if (rear==front) throw "下溢"; i=(front+1) % QueueSize; //注意不要给队头指针赋值 return data[i]; } template 
               
                 int CirQueue 
                
                  ::Empty( ) { if (front==rear) return 1; else return 0; } #include 
                 
                   using namespace std; #include "CirQueue.cpp" void main() { CirQueue 
                  
                    Q; if (Q.Empty()) cout<<"队列为空"< 
                    
                   
                  
                 
                
               
              
             
            
           
          
        
       
       
      
      
     
     
    
    




2.链队列
#ifndef LinkQueue_H
#define LinkQueue_H


template
     
     
      
      
struct Node
{
	DataType data;
	Node
      
      
       
       *next;
};

template
       
       
        
        
class LinkQueue
{
	public:
		LinkQueue();
		~LinkQueue();
		void EnQueue(DataType x);  //将元素x入队
		DataType DeQueue();        //将队头元素出队
		DataType GetQueue();       //取链队列的队头元素
		int Empty();               //判断链队列是否为空
	private:
		Node
        
        
         
         *front,*rear;
};
#endif;

#include "LinkQueue.h"

template
         
         
           LinkQueue 
          
            ::LinkQueue() { Node 
           
             *s=NULL; s=new Node 
            
              ; s->next=NULL; front=rear=s; } template 
             
               LinkQueue 
              
                ::~LinkQueue() { Node 
               
                 *p=NULL; while(front!=NULL) { p=front->next; delete front; front=p; } } template 
                
                  void LinkQueue 
                 
                   ::EnQueue(DataType x) { Node 
                  
                    *s=NULL; s=new Node 
                   
                     ; s->data=x; //申请一个数据域为x的结点s s->next=NULL; rear->next=s;rear=s; //将结点s插入到队尾 } template 
                    
                      DataType LinkQueue 
                     
                       ::DeQueue() { Node 
                      
                        *p=NULL; int x; if(rear==front)throw"下溢"; p=front->next; x=p->data; //暂存队头元素 front->next=p->next; //将队头元素所在结点摘链 if(p->next==NULL)rear=front; //判断出队前队列长度是否为1 delete p; return x; } template 
                       
                         DataType LinkQueue 
                        
                          ::GetQueue() { if(front!=rear) return front->next->data; } template 
                         
                           int LinkQueue 
                          
                            ::Empty() { if(front==rear) return 1; else return 0; } #include 
                           
                             using namespace std; #include "LinkQueue.cpp" void main() { LinkQueue 
                            
                              Q; //创建模板类的实例 if(Q.Empty()) cout<<"队列为空"< 
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
         
        
        
       
       
      
      
     
     




三、实验心得

我发现顺序栈。链栈、顺序队列和链队列之间有许多相似的地方,所以按照书上的部分算法提示,和实验书的源程序,便可以可以写出循环队列的程序,通过实验,可以更对循环队列和链队列之间的区别更加清晰。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值