我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
My dynamically linked queue improperly outputs three return functions when called in the same output stream
对于一项作业,我的任务是创建一个带有链表的队列。我们的教授给了我们测试代码,以确保程序正常运行并进行评分。我的服务函数返回一个字符。但是在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;
显示输出:米 a b b。然而,cout显示为:a m 4。这显然应该显示为:m a 2。
如果我将服务和 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;*/
}
我会给你一个很大的提示:你的输出是"a m 4",而不是"m a 4"。答案的其余部分如下...
.
.
.
.
.
.
(编辑:添加了更多解释(
cout 从右到左运行参数,因为<<
运算符的关联性。所以它获取大小,然后获取队列中的第一项,然后获取下一项。即使运算符本身是从左到右的,为了按该顺序应用它们,它也从右到左评估参数。
可以这样想,虽然在应用右侧运算符之前需要应用左侧的运算符,但在计算左侧运算符之前,它仍然会计算运算符右侧的参数。
这从根本上讲是关于堆栈如何工作的。它从右到左加载参数和运算符的计算,以便可以以相反的顺序应用运算符。
由于运算符的优先级都相同,因此它推送最右边的操作数,然后推最右边的操作数,然后是运算符的左操作数,即左侧的所有操作数。
如果您的运算符是 L-R 关联运算符,这意味着操作数在对 L-R 进行操作之前会计算 R-L。
只是做
cout << q1.serve() << " ";
cout << q1.serve() << " ";
cout << q1.getSize() << endl;
- 如何正确地将分支添加到已存在的树中
- 如何正确地将带有指针的数组传递给函数
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 如何正确地推回然后遍历堆中对象的向量?
- 我是否不正确地集中了这些字符数组?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 我怎样才能通过友谊正确地履行我的职能?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我应该如何正确地将packaged_task移动到 lambda?
- 如何正确地将SHA1CryptoServiceProvider转换为c ++?
- 如何正确地对 constexpr 函数进行单元测试
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何正确地将boost::asio::buffers_iterator转换为InputIterator
- 如何正确地检查变量char中包含的字母
- 无法让程序在C++输出正确的结果
- 当试图交换可变模板类时,如何正确地重载operator=
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 如何正确地编写这些条件,以便它们在控制台中工作