gpt4 book ai didi

c++ - 无法使用喜欢的列表在堆栈中实现正确的(下溢保护)弹出/查看方法

转载 作者:行者123 更新时间:2023-11-28 03:28:36 25 4
gpt4 key购买 nike

好的,我正在为我的 C++ 作业尝试使用链表编写堆栈弹出方法。让我先向您展示节点和列表类,然后再告诉您问题:

class Node
{
public:
int data;
Node* next;

Node(int data, Node* next = 0)
{
this->data = data;
this->next = next;
}
};
class List
{
private:
Node* head; // no need for the tail when using the list for implementing a stack

public:
List()
{
head = 0;
}
void add_to_head(int data)
{
if(head == 0)
{
head = new Node(data);
}
else
{
head = new Node(data, head);
}
}

Node* get_head()
{
return head;
}

// this deletes the head element and makes 'head' points to the node after it.
void delete_head()
{
// storing the head so that we could delete it afterwards.
Node* temp = head;

// making the head point to the next element.
head = temp->next;

// freeing memory from the deleted head.
delete(temp);
}
};

现在这是堆栈:

class stack
{
private:
List* list;

public:
stack()
{
list = new List();
flush();
}
void push(int value)
{
list->add_to_head(value);
}
bool pop(int& value_to_fill)
{
if(is_empty())
{
return false; // underflow...
}

value_to_fill = list->get_head()->data;

// deleting the head. NOTE that head will automatically point to the next element after deletion
// (check out the delete_head definition)
list->delete_head();

return true; // popping succeed.
}
bool peek(int& value_to_fill)
{
if(is_empty())
{
return false;
}
value_to_fill = list->get_head()->data;
return true;
}
// other stuff...
};

现在的问题是 pop 和 peek,我只是觉得它们不方便。不应为 pop 和 peek 提供任何参数,但如果我这样做:

int peek()
{
if(is_empty())
// what should I do here?
return list->get_head()->data;
}
int pop()
{
if(is_empty())
// same thing here.

// deleting the tos then returning it.
// I know this is not what the pop in the STL stack does, but I like it this way
int tos = list->get_head()->data;
list->delete_head();
return tos;
}

发生下溢时,我不知道该怎么办。我不能只返回 -1 或 0 或类似的东西,因为这看起来就像我弹出 -1 或 0(tos == -1 或 0)有没有一种方法可以编写反下溢 pop/peek 而无需通过引用传递任何内容?

最佳答案

这是规范的问题。有几种可能的解决方案:

  • 将堆栈不为空作为 pop 的先决条件。这是客户有责任确保这一点(可能通过调用is_empty() 在弹出之前),并且违反了前提条件导致断言失败。

  • 如果栈为空则抛出异常。这是最明显的解决方案,但可能是最不普遍适用的。

  • 不要让 pop 返回一个值(或者让它返回你的 bool)。到获取顶部元素,您有一个单独的函数 tos() 和一个客户端谁想要两者都需要两个函数调用:x = s.tos(); s.pop();。例如,这就是标准所做的。在实践中,往往首选方法,因为对于复制可能抛出的类型(例如std::string), 不可能实现 pop 返回一个值并且给予强有力的异常(exception)保证。 (不管这是不是问题是另一个问题,但在特定情况下可能会出现问题,并且它是选择标准背后的动机,其中没有流行函数返回一个值。)

最后,重要的是你定义接口(interface),所以您的用户知道会发生什么。

顺便说一句,您不需要 add_to_head 中的 if。如果 head ==
NULL
,你将用第二个参数调用构造函数NULL,所以在这两种情况下您也可以只传递 head

(我将跳过使用链表效率非常低的事实栈的实现方式,既然代码明显是学习练习。)

关于c++ - 无法使用喜欢的列表在堆栈中实现正确的(下溢保护)弹出/查看方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13239212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com