zoukankan      html  css  js  c++  java
  • 队列操作

    //------------------------------------------------------------------------------
    // 队列 即比单链表多了头尾标志而已,本质还是单链表
    //------------------------------------------------------------------------------
    #include <iostream>
    using namespace std;
    
    typedef struct Node
    {
    	int   data;
    	Node* next;
    } Node, *LPNode;
    
    typedef struct Queue
    {
    	Node* first;			// 头
    	Node* rear;				// 尾
    }Queue, *LPQueue;
    
    
    //******************************************************************************
    // Name: CreateQueue
    // Desc: 创建队列
    //******************************************************************************
    Queue* CreateQueue()
    {
    	// 创建并返回一个空的队列
    	Queue* tempQueue = new Queue;
    	tempQueue->first = NULL;
    	tempQueue->rear  = NULL;
    	return tempQueue;
    }
    
    //******************************************************************************
    // Name: Insert
    // Desc: 入队
    //******************************************************************************
    Queue* Insert(Queue* que, int data)
    {
    	// 队里为空,不能进行入队操作
    	if(que == NULL)
    	{
    		return  NULL;
    	}
    
    	// 先创建一个节点
    	Node* newNode = new Node;
    	newNode->data = data;
    	newNode->next = NULL;
    
    	// 因为队列的特点是先进先出,所以入队的时候,插入的位置在最后
    	if(que->first == NULL)
    	{
    		//----------------------------------------------------------------------
    		// 头和尾公用一块地址,所以后面插入的时候,队首也将会自动设置next
    		//----------------------------------------------------------------------
    		que->first = newNode;					// 队首
    		que->rear  = newNode;
    	}
    	else
    	{
    		que->rear->next = newNode;
    		que->rear = newNode;					// 队尾
    	}
    
    	// 返回队列
    	return que;
    
    }
    
    //******************************************************************************
    // Name: OutOfQueue
    // Desc: 出队列, 返回队首元素使用一维指针,因为已经是指针的指针,能改变内容
    //******************************************************************************
    Node* OutOfQueue1(Queue* que)
    {
    	if(que == NULL)
    	{
    		cout<<"队列为空"<<endl;
    		return NULL;
    	}
    
    	// 先进先出原则
    	Node* outNode = que->first;
    	que->first = que->first->next;
    
    	return outNode;							// 返回出队列的元素
    }
    
    
    //******************************************************************************
    // Name: OutOfQueue
    // Desc: 出队列, 返回队首元素,改变了队列的指针,使用二维指针
    //******************************************************************************
    Node* OutOfQueue2(Queue** que)
    {
    	if(*que == NULL)
    	{
    		cout<<"队列为空"<<endl;
    		return NULL;
    	}
    
    	// 先进先出原则
    	Node* outNode = (*que)->first;
    	(*que)->first = (*que)->first->next;
    
    	return outNode;							// 返回出队列的元素
    }
    
    
    //******************************************************************************
    // Name: PrintQueue
    // Desc: 打印队列
    //******************************************************************************
    void PrintQueue(Queue* que)
    {
    	/*			改变指针的指针,改变了堆内存的东西,不想单双链表那样
    	Queue* tempQue = que;
    	while(tempQue->first != NULL)			
    	{
    		cout<<tempQue->first->data<<" ";
    		tempQue->first = tempQue->first->next;
    	}
    	cout<<endl;
    	*/
    
    
    	if(que == NULL)	
    	{
    		cout<<"队列为空"<<endl;
    	}
    
    	Node* tempNode = que->first;
    	while(tempNode != NULL)
    	{
    		cout<<tempNode->data<<" ";
    		tempNode = tempNode->next;
    	}
    	cout<<endl;
    }
    
    //******************************************************************************
    // Name: QueueLength
    // Desc: 返回队列长度
    //******************************************************************************
    int QueueLength(Queue* que)
    {
    	if(que == NULL)
    	{
    		return 0;
    	}
    
    	int currentLength = 0;
    	Node* tempNode = que->first;
    	while(tempNode != NULL)
    	{
    		++currentLength;
    		tempNode = tempNode->next;
    	}
    
    	return currentLength;
    
    }
    
    
    int main()
    {
    	// 创建队列
    	Queue* que = CreateQueue();
    	cout<<"创建队列成功,输入几组要入队的元素"<<endl;
    	
    	// 入队
    	int insertElem;
    	while(cin>>insertElem)
    	{
    		que = Insert(que, insertElem);
    	}
    
    	// 打印
    	cout<<"打印队列:"<<endl;
    	PrintQueue(que);
    
    	// 打印
    	cout<<"打印队列:"<<endl;
    	PrintQueue(que);
    
    	// 出队列
    	Node* outNode = OutOfQueue1(que);
    	cout<<"队列首出队:"<<outNode->data<<endl;
    
    	// 再次打印
    	PrintQueue(que);
    
    	// 打印长度
    	cout<<"当前队列长度为:"<<QueueLength(que)<<endl;
    
    	
    
    	system("pause");
    	return 0;
    }
    



  • 相关阅读:
    Java基础其他
    java网络编程
    java多线程编程
    正则表达式--位置匹配和组
    设计模式
    深入 Java Web
    mysql 好用的sql语句
    spring boot 发送邮件
    dubbo的spi机制
    原理分析dubbo分布式应用中使用zipkin做链路追踪
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3206473.html
Copyright © 2011-2022 走看看