描述
题目描述:
请定义一个顺序队列,可以对队列进行“入队”、“出队”、“清空队列”、“获取队首元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,队列的元素为字母, 队列的最大元素个数为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; } } }描述
题目描述:
请定义一个链式队列,可以对队列进行“入队”、“出队”、“清空队列”、“获取队首元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,队列的元素为字符。
输入描述:
输入各个命令,它们对应的格式如下: 入队: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; }描述
假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点,试编写相应的初始化、入队以及出队算法。
输入时首先执行初始化操作,输入结点个数,再依次输入结点的值;入队列时输入E,然后输入一个结点值,再输出当前队列的所有元素;出队列输入D,然后输出出队列的结点值,再输出当前队列的所有元素。输入Q时,退出。
因为老师给的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; }出队操作,需要注意一下的就是只剩一个元素时,要把队尾指针指回自己。
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; }