当堆栈为空时,'pop()'方法应该返回什么?

zha*_*nwu 16 c c++ data-structures

可能重复:
C++ STL堆栈问题:如果堆栈为空,为什么pop()不会抛出异常?

在C++中设计堆栈时,当堆栈为空时,pop()方法(或front()方法)应该返回什么?以下哪种设计更好?

  1. 抛出一个例外
  2. 未定义,但要求用户在调用pop()之前调用isempty()方法进行检查
  3. 返回bool代码,同时使用额外参数(引用)传递弹出元素
  4. 定义一个唯一的空元素

好的,我看到我的问题不是那么清楚,让我试着改写它:

有一些数据结构可以基于链表,如堆栈,队列来实现,并且每个数据结构都有一个返回前端元素(或尾部)的方法.

我想知道,当数据为空时,是否有关于设计这种方法的原则指南.

而我对更好的定义是"易于正确使用且难以正确使用".

Rae*_*ald 20

按合同编程的方式是,具有非空堆栈是调用的前提条件pop,并且调用不满足其前提条件的方法具有未定义的结果.我的实现会抛出一个std::logic_error,但这不是必需的.在C中,我的实现将abort通过assert.

调用者pop负责确保在调用之前堆栈不为空的前置保持pop.因此,堆栈应该有一个isEmpty让调用者检查的方法.


Jas*_*son 5

C++ STL实现不返回任何东西,pop()因为它解耦返回对象的值并实际从堆栈的内部数据结构中弹出一个对象,使它们成为两个独立的函数.因此,在设计堆栈数据结构时,这是另一个选择.

对于这些类型的数据结构,您的第三个选项也是一种非常惯用的方法.

对于你的第四个选项,而不是一个"唯一的空元素",我实际上会对你的第三个选项做一个变化,你的pop()函数接受指针参数而不是引用类型,如果堆栈中没有剩下的对象,则返回NULL .