首页 > 解决方案 > 在同一输出流中调用时,我的动态链接队列不正确地输出三个返回函数

问题描述

对于一项任务,我的任务是创建一个带有链表的队列。我们的教授给了我们测试代码,以确保程序正常运行并进行评分。我的服务函数返回一个字符。但是在 中main(),该函数在一个cout语句中被调用两次,并且它以错误的顺序返回字符。该getSize函数也被调用,但它似乎没有做任何事情。

cout << boolalpha;
Queue q1 = Queue();
q1.append('m');
q1.append('a');
q1.append('b');
q1.append('b');
q1.display();
cout << q1.serve() << " " << q1.serve() << " " << q1.getSize() << endl;

显示输出:mab b。但是 cout 显示为:am 4。这显然应该显示为:ma 2。

如果我将 serve 和 getSize 函数分开,它工作得很好,即cout << q1.serve() << " "; cout << q1.serve() << " "; cout << q1.getSize() << " ";

下面我发布了链接队列的代码。我想我的节点指针出错了,但是我画了图片并重新编写了代码,但无济于事。如果我的格式不正确,我也深表歉意,因为这是我的第一次发帖。谢谢你。

#include <iostream>
using namespace std;
struct Node {
    char data;
    Node* next;
};

class Queue {
private:
    Node* front, * rear;
    int size;
public:
    Queue();
    void append(char);
    char serve();
    bool isEmpty();
    bool isFull();
    int getSize();
    void display();
}; 

Queue::Queue() {
    front = rear = nullptr;
    size = 0;
}

void Queue::append(char v) {
    Node* p = new Node;
    p->data = v;
    p->next = nullptr;
    if (size == 0) {
        front = rear = p;
        size++;
    }
    else if (size == 1) {
        front->next = p;
        rear = p;
        size++;
    }
    else {
        rear->next = p;
        rear = p;
        size++;
    }
}

char Queue::serve() {
    if (front != nullptr) {
        Node* temp = front;
        char v = temp->data;
        front = front->next;
        delete temp;
        size--;
        return v;
    }
}

bool Queue::isEmpty() {
    return size == 0;
}

bool Queue::isFull() {
    return false;
}

int Queue::getSize() {
    return size;
}

void Queue::display() {
    Node* runner = front;
    while (runner != nullptr) {
        cout << runner->data << " ";
        runner = runner->next;
    }
    cout << endl;
}

int main() {
    cout << boolalpha;
    Queue q1 = Queue();
    q1.append('m');
    q1.append('a');
    q1.append('b');
    q1.append('b');
    q1.display();
    cout << endl << q1.isEmpty() << " " << q1.isFull() << " " << q1.getSize() << endl;
    cout << q1.serve() << " " << q1.serve() << " " << q1.getSize() << endl;
    q1.display();
    cout << endl;

    /*cout << q1.isEmpty() << " " << q1.isFull() << " " << q1.getSize() << endl;
    char a = q1.serve(); char b = q1.serve();
    cout << a << " " << b << " " << q1.getSize() << endl;*/ 
}

标签: c++dynamicreturnqueueoutputstream

解决方案


我会给你一个很大的提示:你的输出是“am 4”,而不是“ma 4”。答案的其余部分如下...

.

.

.

.

.

.

(编辑:添加更多解释)

由于运算符的关联性,cout 从右到左运行参数<<。所以它获取大小,然后获取队列中的第一个项目,然后获取下一个项目。即使运算符本身是从左到右的,为了按该顺序应用它们,它也会从右到左评估参数。

这样想,虽然它需要在应用右边的运算符之前应用左边的运算符,但它仍然在计算左边的参数之前计算运算符右边的参数。

这基本上是关于堆栈如何工作的。它从右到左加载参数和运算符的评估,以便它可以以相反的顺序应用运算符。

由于运算符的优先级相同,因此它是最右边的操作数,然后是最右边的运算符,然后是那个运算符的左操作数,也就是左边的所有内容。

如果您的运算符是 LR 关联的,这意味着操作数在对 LR 进行操作之前先评估 RL。

做就是了

        cout << q1.serve() << " ";
        cout << q1.serve() << " ";
        cout << q1.getSize() << endl;

推荐阅读