• C++数据结构之链式队列(Linked Queue)


    C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从队首指到队尾(front -> Front_Node -> …… -> rear -> Rear_Node).

    代码:

    Node.h文件

    /*
     * Node.h
     *
     *  Created on: 2015年9月10日
     *      Author: Lv_Lang
     */
    
    #ifndef NODE_H_
    #define NODE_H_
    
    #include "stdio.h" 	// for NULL
    
    typedef int Queue_entry;
    typedef Queue_entry Node_entry;
    
    struct Node
    {
    	//	data members
    	Node_entry entry; // 存放的元素
    	Node *next;		  // 指向下一个元素的指针
    	//	Constructors
    	Node();
    	Node(Node_entry item, Node *add_on = NULL);
    };
    
    #endif /* NODE_H_ */
    

    Node.cpp文件:

    /*
     * Node.cpp
     *
     *  Created on: 2015年9月10日
     *      Author: Lv_Lang
     */
    #include "Node.h"
    
    Node::Node()
    {
    	next = NULL;
    }
    Node::Node(Node_entry item, Node *add_on)
    {
    	entry = item;
    	next = add_on;
    }
    
    
    

    Queue.h文件:

    /*
     * Queue.h
     *
     *  Created on: 2015年9月10日
     *      Author: Lv_Lang
     */
    
    #ifndef QUEUE_H_
    #define QUEUE_H_
    
    #include "stdio.h"
    #include "Node.h"
    enum Error_code {overflow,underflow,success};
    
    class Queue
    {
    public:
    //  Standard Queue methods
    	Queue();
    	bool empty()const;
    	Error_code append(const Queue_entry &item);
    	Error_code serve();
    	Error_code retrieve(Queue_entry &item)const;
    //	Safety features for linked structures
    	~Queue();
    	Queue(const Queue &original);
    	void operator = (const Queue &original);
    //  Extended linked queue
    	bool full()const;
    	int size()const;
    	void clear();
    protected:
    	Node *front, *rear;
    };
    
    
    
    #endif /* QUEUE_H_ */
    

    Queue.cpp文件

    /*
     * Queue.cpp
     *
     *  Created on: 2015年9月10日
     *      Author: Lv_Lang
     */
    #include "Queue.h"
    
    Queue::Queue()
    {
    	front = NULL;
    	rear = NULL;
    }
    bool Queue::empty()const
    {
    	if((front == NULL) && (rear == NULL))
    		return true;
    	else
    		return false;
    }
    Error_code Queue::append(const Queue_entry &item)
    {
    	Node *new_rear = new Node(item);
    	if(new_rear == NULL)
    		return overflow;
    	if(rear == NULL) front = rear = new_rear;
    	else
    	{
    		rear->next = new_rear;
    		rear = new_rear;
    	}
    	return success;
    }
    Error_code Queue::serve()
    {
    	if(empty())
    		return underflow;
    	else
    	{
    		Node *old_front = front;
    		front = front->next;
    		if(front == NULL) rear = NULL;// 此处需注意将rear也置为0
    		delete	old_front;
    		return success;
    	}
    }
    Error_code Queue::retrieve(Queue_entry &item)const
    {
    	if(empty())
    			return underflow;
    	else
    	{
    		item = front->entry;
    		return success;
    	}
    }
    Queue::~Queue()
    {
    	if(!empty())
    	{
    		serve();
    	}
    }
    Queue::Queue(const Queue &original)
    {
    	Node *new_front, *original_front = original.front;
    	if(original.front == NULL)
    		front = rear= NULL;
    	else
    	{
    		front = new_front = new Node(original_front->entry);
    		while(original_front->next != NULL)
    		{
    			original_front = original_front->next;
    			new_front->next = new Node(original_front->entry);
    			new_front = new_front->next;
    		}
    	}
    }
    void Queue::operator =(const Queue &original)
    {
    	Node *new_front, *original_front = original.front;
    	if(original.front == NULL)
    		front = rear= NULL;
    	else
    	{
    		if(!empty())
    			clear();
    		else
    		{
    			front = new_front = new Node(original_front->entry);
    			while(original_front->next != NULL)
    			{
    				original_front = original_front->next;
    				new_front->next = new Node(original_front->entry);
    				new_front = new_front->next;
    			}
    		}
    	}
    }
    bool Queue::full()const
    {
    	Node *new_front = new Node();
    	if(new_front == NULL)
    <span style="white-space:pre">	</span>{		
    <span style="white-space:pre">		delete new_front;</span>
    <span style="white-space:pre">		</span>return true;
    <span style="white-space:pre">	</span>}
    	else
    	{
    		delete new_front;
    		return false;
    	}
    }
    int Queue::size()const
    {
    	Node *window = front;
    	int count = 0;
    	while(window != NULL)
    	{
    		window = window->next;
    		count++;
    	}
    	return count;
    }
    void Queue::clear()
    {
    	if(!empty())
    	{
    		serve();
    	}
    }
    

    main函数测试文件:

    /*
     * main.cpp
     *
     *  Created on: 2015年9月10日
     *      Author: Lv_Lang
     */
    #include "Queue.h"
    
    int main()
    {
    	Queue myqueue;
    	myqueue.append(2);
    	myqueue.append(6);
    	int size;
    	size = myqueue.size();
    	printf("%s %d
    ","Size is ",size);
    	myqueue.serve();
    	int a;
    	myqueue.retrieve(a);
    	printf("%d
    ",a);
    	size = myqueue.size();
    	printf("%s %d
    ","Size is ",size);
    
    	Queue QUEUE(myqueue);
    	int b;
    	QUEUE.retrieve(b);
    	printf("%d
    ",b);
    	size = QUEUE.size();
    	printf("%s %d
    ","Size for QUEUE is ",size);
    
    	myqueue.clear();
    	size = myqueue.size();
    	printf("%s %d
    ","Size is ",size);
    
    	return 0;
    }
    
    
    


  • 相关阅读:
    实验报告五
    实验报告四
    树莓派系统安装和调试
    Linux内核分析——扒开系统调用的三层皮(下)
    Linux内核分析——第二章 从内核出发
    Linux内核分析——第一章 Linux内核简介
    Linux内核分析——扒开系统调用的三层皮(上)
    Linux内核分析——构造一个简单的Linux系统MenuOS
    Linux内核分析——操作系统是如何工作的
    Linux内核分析——计算机是如何工作的
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586519.html
Copyright © 2020-2023  润新知