美文网首页
队列的标识和操作的实现CPP

队列的标识和操作的实现CPP

作者: townof1997 | 来源:发表于2019-07-25 14:28 被阅读0次

    23
    代码如下:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    
    typedef char QElemType;
    typedef int Status;
    typedef char SElemType;
    
    // 队列的链式存储结构
    typedef struct QNode {
        QElemType data;             //数据域 
        struct QNode *next;         //指针域 
    }QNode, *QueuePtr; 
    
    typedef struct {
        QueuePtr front;             //队头指针
        QueuePtr rear;              //队为指针 
        
    }LinkQueue;
    
    Status InitQueue(LinkQueue &Q)              //构造一个空的队列 
    {
        Q.front = Q.rear = new QNode;           //生成头结点作为头结点,队头队尾指针指向此节点
        Q.front->next = NULL;                   //头节点的指针设置为空
        return OK; 
    } 
    
    // 链队的入队
    Status EnQueue(LinkQueue &Q, QElemType e)
    {
        QueuePtr p;                     //
        p = new QNode;                  //为入队元素分配节点空间,用指针P指向 
        p->next = NULL;
        p->data = e;                    //将新结点的数据域赋值e 
        Q.rear->next = p;               //将新节点插入队尾 
        Q.rear = p;                 //修改队尾指针 
        
        return OK;  
     } 
     
     // 链队的出队
     Status DeQueue(LinkQueue &Q, QElemType &e)
     {
        QueuePtr p;
        if(Q.front == Q.rear)                   // 队列为空 
            return ERROR;
        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 OK;
    }
    
    // 取链队的队头元素
    SElemType GetHead(LinkQueue Q)
    {
        if(Q.rear !=Q.front)
            return Q.front->next->data;         //返回队头元素的值,队头指针不变 
    }
     
    
    int main()
    {
        int choose, flag= 0;
        LinkQueue Q;
        QElemType e, j;
        
        cout << "1,初始化队列, 2,入队, 3,读取队头元素" << endl;
        cout << "4,出队, 0,退出系统" << endl;
        
        choose = -1;
        while(choose != 0)
        {
            cout << "请选择操作项:";
            cin >> choose;
            switch(choose){
                case 1:     //初始化 
                    if(InitQueue(Q))
                    {
                        flag = 1;
                        cout << "链队初始化成功.\n";
                    }
                    else {
                        cout << "链队初始化失败.\n\n";
                    } 
                    break;
                case 2: {   //入队 
                    fstream file;
                    file.open("QNode.txt");
                    if(!file){
                        cout << "读取文件失败.\n\n";
                        exit(ERROR);
                    }
                    if(flag){
                        flag = 1;
                        cout << "入队的元素依次为:\n";
                        while(!file.eof())
                        {
                            file >> j;
                            if(file.fail())
                                break;
                            else{
                                EnQueue(Q, j);
                                cout << j << " ";
                            }
                        }
                        cout << "\n\n" <<endl;
                    } else 
                        cout << "队列创建失败,请重新选择.\n" << endl;
                    file.close();
                    
                }
                    break;
                case 3:         //出队
                    if(flag != -1 && flag != 0)
                    {
                        cout << "对头元素为:\n" << GetHead(Q) << endl; 
                    } 
                    else 
                        cout << "队列中无元素,请重新选择.\n\n";
                    break;
                case 4:         // 链队的出队                
                    cout << "依次弹出的对头元素为:\n";
                    while(DeQueue(Q, e)) 
                    {
                        flag = -1;
                        cout << e << " ";
                    }
                    cout << endl << endl;
                    break;
                    
            }
        }
        
        
        
        return 0;
    } 
    

    相关文章

      网友评论

          本文标题:队列的标识和操作的实现CPP

          本文链接:https://www.haomeiwen.com/subject/nsrhrctx.html