目录
堆栈和队列算法-双向队列
C++代码
堆栈和队列算法-双向队列
双向队列(Double Ended Queues,DEQue)为一个有序线性表,加入与删除操作可在队列的任意一端进行。
具体来说,双向队列就是允许队列两端中的任意一端都具备删除和加入功能,而且无论是队列的左端还是右端,队首与队尾指针都是朝队列中央移动的。通常,双向队列的应用可以区分为两种:一种是数据只能从一端加入,但可以从两端取出;另一种是数据可以从两端加入,但只能从一端取出。
C++代码
下面的C++程序使用链表结构来设计一个有输入限制的双向队列,只能从双向队列的一端加入数据,但从这个双向队列中取出数据时可以分别从队列的前端和末尾取出。
#include<iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
};
class Queue {
private:
Node* front;
Node* rear;
public:
Queue() {
front = nullptr;
rear = nullptr;
}
void Push(int num) {
Node* newNode = new Node;
newNode->data = num;
newNode->next = nullptr;
if (rear == nullptr)
front = newNode;
else
rear->next = newNode;
rear = newNode;
}
void Pop_Front() {
if (!(front == nullptr)) {
if (front == rear)
rear = nullptr;
front = front->next;
}
}
void Pop_Back() {
if (!(rear == nullptr)) {
Node* startNode = front;
Node* tempNode = front;
while (front->next != rear && front->next != nullptr) {
front = front->next;
tempNode = front;
}
front = startNode;
rear = tempNode;
if ((front->next == nullptr) || (rear->next == nullptr)) {
front = nullptr;
rear = nullptr;
}
}
}
void Print() {
while (true) {
if (front->next != nullptr) {
cout << front->data << " ";
Pop_Front();
}
else
break;
}
}
};
int main() {
Queue* queue = new Queue();
char ch = ' ';
while (ch != 'E') {
cout << "输入I:往队列加入数据;输入F:从队列前取出数据;输入B:从队列后取出数据;输入E:结束程序" << endl;
cout << "请输入:";
cin >> ch;
switch (ch)
{
case 'I':
cout << "请输入数据:";
int val;
cin >> val;
queue->Push(val);
break;
case 'F':
queue->Pop_Front();
break;
case 'B':
queue->Pop_Back();
break;
default:
break;
}
}
cout << "队列中的数据:";
queue->Print();
return 0;
}
输出结果