我尝试使用数组实现队列。这是我的代码:
#include <iostream.h>
#define SIZE 5
class queue
{
int *Queue, front, rear;
public:
queue() {
Queue = new int[SIZE];
front = rear = -1;
}
void push() {
if (rear == (SIZE-1)) {
cout<<"\n Overflow!";
} else {
rear++;
cout<<"\n Enter element: ";
cin>>Queue[rear];
}
}
void pop() {
if (front == rear) {
cout<<"\n Underflow!";
} else {
cout<<"\nElement popped: "<<Queue[++front];
}
}
void display() {
if (front == rear) {
cout<<"\n Queue Empty";
} else {
for(int i = (front+1); i<=rear; i++) {
cout<<Queue[i]<<" ";
}
}
}
};
int main()
{
int choice;
queue q;
while(choice != 4)
{
cout<<"\n\n Enter your choice :"
<<"\n 1. Push an element into Queue."
<<"\n 2. Pop an element from Queue."
<<"\n 3. Display the Queue."
<<"\n 4. Exit the program.\n\n";
cin>>choice;
switch (choice) {
case 1:
q.push();
break;
case 2:
q.pop();
break;
case 3:
q.display();
break;
case 4:
break;
}
}
return 0;
}
事情是,一旦满足溢出,即使在弹出一个元素后,后部保持不变,并且当有一个空置的空间时,不会添加另一个元素。
对此的解决方案可能是将每个元素向前移动一个位置,以便在结束时有空位但我在移位时遇到问题。此外,如果我在达到溢出之前弹出2-3次后尝试插入,那么即使队列中只有3个元素,它仍然会溢出。 我该如何解决这个问题?
答案 0 :(得分:0)
实施Circular Buffer以避免转移整个数据。
答案 1 :(得分:0)
您永远不会重置front
或rear
,它们会不断增加。
过度测试也是错误的:
if (rear == (SIZE-1)) {
cout<<"\n Overflow!";
你应该测试的是你是否要覆盖前面。我认为您只需保留front
和元素数N
即可获益。然后溢出和下溢变为N>SIZE
和N==0
。然后在弹出和推动时增加和减少N
。保持原样,但也保持模SIZE
。
另外,正如评论中所写。无需移动数据。