队列的实现可以基于数组实现,也可以基于单链表实现。
下面给出数组实现,为防止队列多次进行插入和删除操作导致的前面的数组空间被浪费,采用循环队列的方式。
声明一个队列类,这里要注意maxn的大小,因为是循环队列,所以不用太大。如果太大,类又是在main函数中定义的,就有可能导致栈溢出。
class Queue
{
public:
Queue();
int PUSH(int x);
int POP();
int MINUS();
int MAX();
private:
int font;
int rear;
int data[maxn]; // 这是基于数组的线形队列
int maxnum;
};
析构函数:
Queue::Queue()
{
rear = 0;
font = 0;
maxnum = INT_MIN;
memset(data,0,sizeof(data));
}
插入操作:
int Queue::PUSH(int x)
{
if((rear + 1)% maxn == font)
return 0;
else
{
data[rear] = x;
rear = (rear + 1) % maxn;
return 1;
}
}
取队头元素:
int Queue::POP()
{
if(rear == font)
return 0;
else
{
font = (font + 1) % maxn;
return 1;
}
}
相反数逆转:
int Queue::MINUS()
{
if(rear == font )
return 0;
else
{
for(int i = font;i < rear ;i = (i+1) %maxn)
data[i] = -data[i];
return 1;
}
}
注意:因为相反数操作是对于每一个元素的改变,因此时间复杂度为线性级O(n)
找最大元素:
int Queue::MAX()
{
if(rear == font)
return INT_MIN;
else
{
maxnum = INT_MIN;
for(int i = font;i <rear ;i = (i+1) %maxn)
{
if(data[i] > maxnum)
maxnum = data[i];
}
return maxnum;
}
}
很显然,这种找最大数的方案非常慢。快速差找最大数,可以有以下两种方案:
1.采用一个辅助栈记录信息。
2.用双栈实现队列。