out()函数不起作用

时间:2014-09-24 16:48:35

标签: c++

在这个c ++代码中,我编写了一个队列(FIFO)的基本代码。但是out()函数似乎不起作用,它会将最旧的输入返回到数组中。首先调用该函数时,它可以正常工作。但第二次没有。这是代码:

#include<iostream>
using namespace std;

class Queue    {
    int que[100];
    int index=0;
    int f;
public:
    void in(int num);
    int out();
};

void Queue::in(int num){
    if(index==100) 
        cout<<"Que is full\n";
    else{
        que[index]=num;
        f=index;
        index++;
    }

}

int Queue::out(){
    if(index==0) 
        cout<<"Queue is empty\n";
    else{
        if(f>=0){
            return que[--index-f];
            index++;
            f--;
        }else{
            cout<<"Queue is empty";
            return 0;
        }
    }
}


int main(){
    Queue q;
    q.in(101);
    q.in(202);
    q.in(303);
    q.in(404);

    cout<<q.out()<<"\n";
    cout<<q.out()<<"\n";
    cout<<q.out();
}

2 个答案:

答案 0 :(得分:1)

那是因为你在修改f和索引之前从函数返回。此外,如果队列已满,函数可以在不返回任何内容的情况下结束。

答案 1 :(得分:0)

如上所述,您的代码永远不会过去return que[--index-f];所以您应该重新排序代码,以便在执行该语句之前不修改索引并修改f,例如。

 f--;
 return que[index-f-2];

索引的增量和减量不是必需的,所以不要这样做。即使进行了此更改,您的代码也不会执行所述的所需行为,您的in()函数实际上也是错误的。通过设置f=index如果在调出out函数后向队列中添加数字,则会在初始输入处重置通过它的进度。最后,你的out函数实际上并没有从队列中删除第一个条目。

除非迫切需要不利用动态分配,否则我建议您从使用数组转移到std::vector。然后,您的Queue类将具有动态队列大小,您可以在创建对象时更改该大小。见下文:

class Queue{
    private:
        std::vector<int> que;
        int maxSize;

    public:
        Queue(int size=100);
        ~Queue();
        void in(int num);
        int out();
};

Queue::Queue(int size):maxSize(size) {}
Queue::~Queue() {}

void Queue::in(int num)
{
    if(que.size() >= maxSize)
        std::cout << "Que is full\n";
    else
        que.push_back(num);
}

int Queue::out()
{
    if(que.empty())
    {
        std::cout << "Queue is empty\n";
        //optionally throw an error here if you really want the program to not return a number
        return 0;
    }
    int returnVal = que.front();
    que.erase(que.begin());
    return returnVal;
}