• C++学习---队列的构建及操作


    一、循环队列

     

    #include <iostream>
    using namespace std;
    #define MAXQSIZE 100
    typedef struct {
        int* base;//存储空间的基地址
        int front;//头指针
        int rear;//尾指针
    }SqQueue;
    
    //初始化队列  构造一个空队列Q
    void InitQueue(SqQueue& Q) {
        Q.base = new int[MAXQSIZE];//为队列分配一个最大容量为MAXQSIZE的数组空间
        if (!Q.base) exit(OVERFLOW);//存储分配失败
        Q.front = Q.rear = 0;//将0赋值给头指针和尾指针,表示队列为空
    }
    //入队,e为插入的元素
    bool EnQueue(SqQueue& Q, int e) {
        if ((Q.rear + 1) % MAXQSIZE == Q.front) return false;//尾指针在循环意义上加1后等于头指针,表示队满
        Q.base[Q.rear] = e;//e插入队尾
        Q.rear = (Q.rear + 1) % MAXQSIZE;//队尾指针加1.如果超过100则从0重新计数
        return true;
    }
    //出队,删除队列Q的队头元素,用e返回其值
    bool DeQueue(SqQueue& Q, int &e) {
        if (Q.front == Q.rear) return false;//队空
        e = Q.base[Q.front];//将队头元素赋值给e
        Q.front = (Q.front + 1) % MAXQSIZE;//队头指针加一
        return true;
    }
    //取队头元素
    int GetHead(SqQueue Q) {
        //当队列不为空时,返回队列头元素
        if (Q.front != Q.rear)
            return Q.base[Q.front];
    	return NULL;
    }
    //返回队列Q的元素个数
    int QueueLength(SqQueue Q) {
        return(Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
    }
    //批量入队(这里默认不会超过最大元素数MAXQSIZE)
    void QueueInput(SqQueue& Q) {
    	int value;//用户输入的值
    	int n = 0;//输入数据的个数
    	cout << "你想要输入几个数据?" << endl;
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cout << "请输入第" << i + 1 << "个数据:";
    		cin >> value;//输入元素值
    		if(EnQueue(Q,value)) cout << "入队成功!" << endl;
    		else cout << "入队失败!";
    	}
    }
    //依次出队
    void QueueOut(SqQueue& Q) {
    	int value;
    	cout << "依次出队的值为:
    ";
    	while (DeQueue(Q, value))
    		cout << value<<"	";
    }
    
    int main()
    {
    	int opearateNum = 0;//操作值
    	SqQueue Q;
    	InitQueue(Q);
    	while (true)
    	{
    		cout << "1、批量入队	2、全部依次出队	3、取队头元素值	4、出队	5、队列元素个数	6、退出" << endl;
    		cin >> opearateNum;
    		if (opearateNum == 6)
    			break;
    		switch (opearateNum)
    		{
    		case 1:
    			//数据输入
    			QueueInput(Q);
    			system("pause");
    			system("cls");
    			break;
    		case 2:
    			//依次出队
    			QueueOut(Q);
    			system("pause");
    			system("cls");
    			break;
    		case 3:
    			if (Q.rear == Q.front)
    				cout << "队列无元素" << endl;
    			else
    				cout << "队头元素值为:" << GetHead(Q) << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 4:
    			int value;//出队的值
    			cout << "出队的元素值为:";
    			if (!DeQueue(Q,value))
    				cout << "队列无元素!" << endl;
    			else
    				cout << value << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 5:
    			cout << "队列共有" << QueueLength(Q) << "个元素" << endl;
    			system("pause");
    			system("cls");
    			break;
    		default:
    			cout << "无效操作,请重新输入!" << endl;
    			break;
    		}
    
    	}
    }
    

     

      二、链队

     

    #include <iostream>
    using namespace std;
    
    typedef struct QNode {
        int data;
        struct QNode* next;
    }*QueuePtr;
    typedef struct {
        QueuePtr front;//队头指针
        QueuePtr rear;//队尾指针
    }LinkQueue;
    
    //初始化队列   构造空的队列
    void InitQueue(LinkQueue& Q) {
        Q.front = Q.rear = new QNode;//生成新结点作为头结点,队头和队尾指针指向此结点
        Q.front->next = NULL;//头结点的指针域置空
    }
    
    //入队   插入元素e为队列Q的新的队尾元素
    bool EnQueue(LinkQueue& Q, int e) {
        QNode* p = new QNode;//为入队元素分配结点空间,用指针p指向
        p->data = e;//将新结点数据域置为e
        p->next = NULL;
        Q.rear->next = p;//将新结点插入到队尾
        Q.rear = p;//修改队尾指针
        return true;
    }
    
    //出队  删除队列Q的队头元素,用e返回其值
    bool DeQueue(LinkQueue& Q, int &e) {
        if (Q.front == Q.rear) return false;//若队列为空,则返回false
        QNode* p = Q.front->next;//生成新结点p指向队头元素
        e = p->data;//e保存队头元素的值
        Q.front->next = p->next;//修改头结点的指针域
        if (Q.rear == p) Q.rear = Q.front;//如果只有一个元素则将队尾指针指向头结点
        delete p;//释放队头元素的空间
        return true;
    }
    
    //取队头元素
    int GetHead(LinkQueue Q) {
        if (Q.front != Q.rear)//队列不为空
            return Q.front->next->data;//返回队头元素的值
    }
    
    //批量入队(这里默认不会超过最大元素数MAXQSIZE)
    void QueueInput(LinkQueue& Q) {
    	int value;//用户输入的值
    	int n = 0;//输入数据的个数
    	cout << "你想要输入几个数据?" << endl;
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cout << "请输入第" << i + 1 << "个数据:";
    		cin >> value;//输入元素值
    		if (EnQueue(Q, value)) cout << "入队成功!" << endl;
    		else cout << "入队失败!";
    	}
    }
    //依次出队
    void QueueOut(LinkQueue& Q) {
    	int value;
    	cout << "依次出队的值为:
    ";
    	while (DeQueue(Q, value))
    		cout << value << "	";
    }
    int main()
    {
    	int opearateNum = 0;//操作值
    	LinkQueue Q;
    	InitQueue(Q);
    	while (true)
    	{
    		cout << "1、批量入队	2、全部依次出队	3、取队头元素值	4、出队	5、入队	6、退出" << endl;
    		cin >> opearateNum;
    		if (opearateNum == 6)
    			break;
    		switch (opearateNum)
    		{
    		case 1:
    			//数据输入
    			QueueInput(Q);
    			system("pause");
    			system("cls");
    			break;
    		case 2:
    			//依次出队
    			QueueOut(Q);
    			system("pause");
    			system("cls");
    			break;
    		case 3:
    			if (Q.rear == Q.front)
    				cout << "队列无元素" << endl;
    			else
    				cout << "队头元素值为:" << GetHead(Q) << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 4:
    			int value;//出队的值
    			cout << "出队的元素值为:";
    			if (!DeQueue(Q,value))
    				cout << "队列无元素!" << endl;
    			else
    				cout << value << endl;
    			system("pause");
    			system("cls");
    			break;
    		case 5:
    			int e;//用户输入的值
    			cout << "请输入入队的值:";
    			cin >> e;
    			if (EnQueue(Q, e))
    				cout << "入队成功!" << endl;
    			else
    				cout << "入队失败!" << endl;
    			system("pause");
    			system("cls");
    			break;
    		default:
    			cout << "无效操作,请重新输入!" << endl;
    			break;
    		}
    
    	}
    }
    

     

      

     

     

  • 相关阅读:
    表单提交时,更新的操作
    提交后刷新本页面与移除本页面的JS写法
    jquery的$.each如何退出循环和退出本次循环
    修改本机host文件,使upf报表操作变的快
    代码记录
    JQuery简介
    Ubuntu安装
    PHP笔记(PHP高级篇)
    将Session写入Memcache
    将Session写入数据库
  • 原文地址:https://www.cnblogs.com/edllixiaoyu/p/13781281.html
Copyright © 2020-2023  润新知