在堆栈中执行POP时下溢中的异常处理

tan*_*anz 2 c++ algorithm stack

我想知道当top变量达到-1时没有应用异常处理(没有元素留给pop).目前,我正在使用cout为用户提供有关堆栈下溢和返回0的信息,这不是一个好习惯.总体上可以对此pop函数进行哪些改进,以及如何在堆栈达到下溢状态时通知用户并处理异常.

int Mystack::pop()
{
    if (isEmpty())
    {
        std::cout << "Stack Underflow" << std::endl;
    }
    else
    { 
        std::cout << "The popped element is" << A[top];
        return A[top--];
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

主要部分:

case 4:
            std::cout << "POP the element" << std::endl;
            s1.pop();
            break;
Run Code Online (Sandbox Code Playgroud)

Pau*_*zie 5

你可以抛出out_of_range异常:

#include <stdexcept>
int Mystack::pop()
{
    if (isEmpty())
       throw std::out_of_range("Stack Underflow");
    std::cout << "The popped element is" << A[top];
    return A[top--];
}
Run Code Online (Sandbox Code Playgroud)

在客户端:

void foo() 
{
   Mystack ms;
   //...
  try 
  {
    ms.pop();
  }
  catch (const std::out_of_range& oor) 
  {
    std::cerr << "Out of Range error: " << oor.what() << '\n';
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如下面提到的评论,您也可以从中派生自己的例外std::exception.这是一个简单的例子:

#include <stdexcept>
struct myStackException : public std::exception
{
   const char *what() const noexcept { return "Stack Overflow"; }
};

int Mystack::pop()
{
    if (isEmpty())
        throw myStackException();
    std::cout << "The popped element is" << A[top];
    return A[top--];
}
Run Code Online (Sandbox Code Playgroud)

实时(虚拟)示例:http://ideone.com/ZyqiQ0