【ACM】手动实现线性队列

队列的实现可以基于数组实现,也可以基于单链表实现。
下面给出数组实现,为防止队列多次进行插入和删除操作导致的前面的数组空间被浪费,采用循环队列的方式。

声明一个队列类,这里要注意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.用双栈实现队列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值