队列

    科技2022-07-13  117

    队列

    数组实现

    1.循环队列基本操作

    描述

    题目描述:

    请定义一个顺序队列,可以对队列进行“入队”、“出队”、“清空队列”、“获取队首元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,队列的元素为字母, 队列的最大元素个数为100。

    输入描述:

    输入各个命令,它们对应的格式如下: 入队:E a,a代表入队的元素,这里E和元素之间用空格分隔。 清空队列:C;获取队头元素:当输入的命令为D时,输出出队的元素值; 当输入的命令是G时,输出当前队首元素值; 如果没有元素可出队或可取, 输出None;当输入的命令是Q时结束程序。

    #include <iostream> #include <string> using namespace std; char data[101]; //队尾 int front = 100; //队头 int rear =100; void EnQue(char c) { //TODO if(((rear + 1) % 101) != front ){ rear++; data[rear%101]=c; } } char DeQue() { //只要判断头尾不相等即可出队 if((front % 100) != rear ){ return data[(front++)%100]; } } char GetQue() { //TODO return data[rear % 101]; } void del() { front =rear =100; } int main() { char t; char c; while(cin >> t && t !='Q') { switch(t) { case 'E': cin >>c; EnQue(c); break; case 'D': c =DeQue(); if( c!=0) cout <<c<<endl; else cout <<"None"<<endl; break; case 'G': c =GetQue(); if( c!=0) cout <<c<<endl; else cout <<"None"<<endl; break; case'C': del(); break; } } }

    链表实现

    1.队列的链式存储基本操作

    描述

    题目描述:

    请定义一个链式队列,可以对队列进行“入队”、“出队”、“清空队列”、“获取队首元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,队列的元素为字符。

    输入描述:

    输入各个命令,它们对应的格式如下: 入队:E a,a代表入队的元素,这里E和元素之间用空格分隔。 清空队列:C 获取队头元素:G 队头元素出队列:D 当输入的命令为Q时,程序结束。

    链式队列的数据结构

    基本操作中稍微可以说一说的就是出队操作了吧?

    #include <iostream> using namespace std; struct node { char data; node* next; }; node* p, * s; class LinkQueue { public: LinkQueue(); ~LinkQueue(); void enqueue(char x); void dequeue(); void getqueue(); void empty(); private: node* front, * rear; }; LinkQueue::LinkQueue() { s = new node; s->next = NULL; front = rear = s; } LinkQueue::~LinkQueue() { p = front; while (front != NULL) { front = front->next; delete p; p = front; } } //出队 void LinkQueue::enqueue(char x) { //TODO s = new node; s->data = x; s->next = NULL; rear->next = s; rear = s; return; } //入队 void LinkQueue::dequeue() { //TODO if (front->next != NULL) { p = front->next; front->next = p->next; cout << p->data << endl; delete p; } else { cout << "None" << endl; } return; } void LinkQueue::getqueue() { //TODO p = front->next; cout << p->data << endl; return; } void LinkQueue::empty() { //TODO p = front; while (front->next != NULL) { front = front->next; delete p; p = front; } } int main() { char c, x; LinkQueue m; while (1) { cin >> c; if (c == 'E') { cin >> x; m.enqueue(x); } else if (c == 'C') { m.empty(); } else if (c == 'G') { m.getqueue(); } else if (c == 'D') { m.dequeue(); } else if (c == 'Q') { break; } } return 0; }

    2.循环链表表示队列

    描述

    假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点,试编写相应的初始化、入队以及出队算法。

    输入时首先执行初始化操作,输入结点个数,再依次输入结点的值;入队列时输入E,然后输入一个结点值,再输出当前队列的所有元素;出队列输入D,然后输出出队列的结点值,再输出当前队列的所有元素。输入Q时,退出。

    InitEmpty

    因为老师给的InitEmpty函数没看懂,所以我自己重新写了一个。思想是保留最开始的front结点,然后将rear结点的指针域指为NULL。然后一个一个delete。

    int InitEmpty(LinkQueue& Q) { //获得头结点 QueuePtr ptr = Q.rear->next; QueuePtr middle = NULL; Q.rear->next = NULL; while (ptr->next != NULL) { middle = ptr->next; ptr->next = middle->next; delete middle; } Q.rear = ptr; Q.rear->next = Q.rear; return 1; }

    DeQueue

    出队操作,需要注意一下的就是只剩一个元素时,要把队尾指针指回自己。

    void DeQueue(LinkQueue& Q, int& e) { struct QNode* p; /*if (Q.rear == Q.rear->next) { cout << "None" << endl; return; }*/ p = Q.rear->next->next;//p指向第一个节点 e = p->data; if (p == Q.rear) { //当只有一个元素时,p出队后,要将队尾指针指向头结点 Q.rear = Q.rear->next; Q.rear->next = Q.rear; delete p; } else { Q.rear->next->next = p->next; delete p; } cout << e << endl; return; }

    全部代码

    #include <iostream> #include <stdio.h> using namespace std; #define MAX 100 /* 链队结构定义 */ //定义节点类型 typedef struct QNode { int data;//数据域 struct QNode* next;//指针域 }QNode, * QueuePtr; //只设置一个尾指针 typedef struct { QueuePtr rear;//尾指针 }LinkQueue; /* 1.首先生成一个头结点,并分配存储空间; 2.初始时,尾指针指向头结点,头结点的指针域指向尾指针 带有一个尾指针,初始时,尾指针指向头结点。 尾指针指向的是链表的最后一个元素,假设尾指针为p,则,p=头结点 这里尾指针是Q.rear,则Q.rear=头结点 */ void InitQueue(LinkQueue& Q) { Q.rear = new QNode; Q.rear->next = Q.rear;// } //判断队列是否为空 /* 由于尾指针指向最后一个结点,所以当尾指针执行那个本身, 即Q.rear->next=Q.rear时,表示队列为空。 */ int IsEmpty(LinkQueue& Q) { if (Q.rear->next == Q.rear) { return 1;//空 } else { return 0; } } //将队列置空 //就是将除了头结点以外的结点删除 int InitEmpty(LinkQueue& Q) { //获得头结点 QueuePtr ptr = Q.rear->next; QueuePtr middle = NULL; Q.rear->next = NULL; while (ptr->next != NULL) { middle = ptr->next; ptr->next = middle->next; delete middle; } Q.rear = ptr; Q.rear->next = Q.rear; return 1; } //入队操作 void EnQueue(LinkQueue& Q, int e) { struct QNode* p; p = new QNode; p->data = e; p->next = Q.rear->next; Q.rear->next = p; Q.rear = p; return; } //出队操作 void DeQueue(LinkQueue& Q, int& e) { struct QNode* p; if (Q.rear == Q.rear->next) { cout << "None" << endl; return; } p = Q.rear->next->next;//p指向第一个节点 e = p->data; if (p == Q.rear) { //当只有一个元素时,p出队后,要将队尾指针指向头结点 Q.rear = Q.rear->next; Q.rear->next = Q.rear; delete p; } else { Q.rear->next->next = p->next; delete p; } cout << e << endl; return; } //遍历 void Print(LinkQueue& Q, int n) { QNode* t = Q.rear->next->next; for (int i = 0; i < n; i++) { cout << t->data << " "; t = t->next; } cout << endl; } int main() { LinkQueue Q; InitQueue(Q); int num = 0; int n = 0; cin >> n; for (int i = 0; i < n; i++) { cin >> num; EnQueue(Q, num); } char c; while (true) { cin >> c; if (c == 'E') { cin >> num; //cout << c << " " << x << endl; n += 1; EnQueue(Q, num); Print(Q, n); } else if (c == 'D') { //cout << c << endl; n -= 1; DeQueue(Q, num); //cout << num << endl; Print(Q, n); } else break; } }
    Processed: 0.013, SQL: 8