• 循环队列


    #include<iostream>
    #include<fstream>
    #include<cstring>
    using namespace std;
    
    #define MaxSize 100
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    typedef char Stype;
    
    typedef struct{
        char *base;
        int front;//头指针
        int rear;//尾指针
    }SqQueue;
    
    //循环队列的初始化
    int InitQueue(SqQueue &q){//构造一个空队列q
        q.base=new char[MaxSize];//为队列分配空间
        if(!q.base)
        exit(OVERFLOW);//存储分配失败 退出
        q.front=q.rear=0;//头指针和尾指针置为0 队列为空
        return OK;
    }
    // 求循环队列的长度
    int QueueLength(SqQueue q){
        return (q.rear-q.front+MaxSize)%MaxSize;
    }
    //循环队列的入队
    int EnQueue(SqQueue &q,char e){
        if((q.rear+1)%MaxSize==q.front)
            return ERROR;
            q.base[q.rear]=e;//新元素插入队尾
            q.rear=(q.rear+1)%MaxSize;//尾指针加1
            return OK;
    }
    //循环队列的出队
    int DeQueue(SqQueue &q ,char &e){
        if(q.front==q.rear)
            return ERROR;//队列为空 返回
            e=q.base[q.front];//取队首数据
            q.front=(q.front+1)%MaxSize;//头指针数据加1 表示头数据向后移了一位
            return OK;
    }
    
    //取循环队列的头元素
    Stype GetHead(SqQueue q){
        if(q.front!=q.rear)//队列不为空
          return q.base[q.front];
    }
    
    
    int main(){
        int choose,flag=0;
        SqQueue Q;
        char e,j;
        cout << " 1.初始化
     ";
    	cout << " 2.入队
     ";
    	cout << " 3.读队头元素
     ";
    	cout << " 4.出队
     ";
    	cout << " 0.退出
    
     ";
        choose = -1;
    	while (choose != 0) {
    		cout << " 请选择: ";
    		cin >> choose;
    		switch (choose) {
    		case 1://算法3.16 链队的初始化
    			if (InitQueue(Q)) {
    				flag = 1;
    				cout << " 成功对队列进行初始化
    
     ";
    			} else
    				cout << " 初始化队列失败
    
     ";
    			break;
    		case 2: {//算法3.17 链队的入队
    			fstream file;
    			file.open("QNode.txt");
    			if (!file) {
    				cout << " 错误!未找到文件!
    
     " << endl;
    				exit(ERROR);
    			}
    			if (flag) {
    				flag = 1;
    				cout << " 入队的元素依次为:
     ";
    				while (!file.eof()) {
    					file >> j;
    					if (file.fail())
    						break;
    					else {
    						EnQueue(Q, j);
    						cout << j << "  ";
    					}
    				}
    				cout << endl << endl;
    			} else
    				cout << " 队列未建立,请重新选择
    
     ";
    			file.close();
    		}
    			break;
    		case 3://算法3.19 取链队的队头元素
    			if (flag != -1 && flag != 0)
    				cout << " 队头元素为:
     " << GetHead(Q) << endl << endl;
    			else
    				cout << " 队列中无元素,请重新选择
     " << endl;
    			break;
    		case 4://算法3.18 链队的出队
    			cout << " 依次弹出的队头元素为:
     ";
    			while (DeQueue(Q, e)) {
    				flag = -1;
    				cout << e << "  ";
    			}
    			cout << endl << endl;
    			break;
    		}
    	}
    	return 0;
    }
    循环队列秉承先进先出的原则,定义了 *base 存储数据的指针 front 指向队列的第一个元素 rear 指向队列的最后一个元素 插入一条数据 rear+1;
  • 相关阅读:
    魔法方法中的__str__和__repr__区别
    新建分类目录后,点击显示错误页面?
    3.用while和for循环分别计算100以内奇数和偶数的和,并输出。
    2.for循环实现打印1到10
    1.while循环实现打印1到10
    021_for语句
    014_运算符_字符串连接
    020_while语句
    019_增强switch语句
    018_switch语句
  • 原文地址:https://www.cnblogs.com/smallbrokenchildwen/p/6810022.html
Copyright © 2020-2023  润新知