1

所以对于我的一个任务,我们必须修改一个堆栈类并测试它。我已经成功地添加了所有必要的方法,但我坚持的是当我演示它时如何最好地打印出堆栈中的内容。所以基本上,我要用随机数据填充堆栈并测试我实现的各种方法,但我不知道如何将堆栈打印到控制台以表明我实际上已经完成了我应该做的事情. 我知道这是一个非常基本的问题,但我只是被困在这里。我猜我必须以某种方式使用 getTop 方法,但是如何使用它来打印堆栈中的内容。这是我所有的文件:

StackP.cpp

    #include <cassert>

    using namespace std;

     #include "StackP.h"

     Stack::Stack()
        : topPtr(0) {
     }

     Stack::Stack(const Stack& aStack)
        throw(OutOfStorageException) {

        // Original list is empty
        if (aStack.topPtr == 0) {
           topPtr = 0;
        }
        else {
           try {
              // Copy first node
              topPtr = new StackNode;
              topPtr->item = aStack.topPtr->item;

              // Copy rest of list
              StackNode* newPtr = topPtr;    // Pointer to new list 
              for (StackNode* origPtr = aStack.topPtr->next;
                   origPtr != 0;
                   origPtr = origPtr->next) {
                 newPtr->next = new StackNode;
                 newPtr = newPtr->next;
                 newPtr->item = origPtr->item;
              }

             newPtr->next = 0;
           }
           catch (const bad_alloc&) {
           // Release all memory successfully allocated in this copy
              while (!isEmpty() ) {
                pop();
              }
              throw OutOfStorageException("Out of memory");
           }
        }
     }

     Stack::~Stack() {

        // Pop until stack is empty
    while (!isEmpty() ) {                            
       pop();
    }
    assert(topPtr == 0);
 }

 bool Stack::isEmpty() const {

    return topPtr == 0;
 }

 void Stack::push(const StackItemType& newItem)
    throw(OutOfStorageException) {

    try {
       StackNode* newPtr = new StackNode;

       newPtr->item = newItem;

       newPtr->next = topPtr;
       topPtr = newPtr;
    }
    catch (const bad_alloc&) {
       throw OutOfStorageException("Out of memory");
    }
    }
 }

 void Stack::pop()
    throw(OutOfDataException) {

    if (isEmpty() ) {
       throw OutOfDataException("Cannot pop an empty stack.");
    }
    StackNode* temp = topPtr;
    topPtr = topPtr->next;

    temp->next = 0;  // safeguard
    delete temp;
 }

 void Stack::pop(StackItemType& stackTop)
    throw(OutOfDataException) {

    if (isEmpty() ) {
       throw OutOfDataException("Cannot pop an empty stack.");
    }
    stackTop = topPtr->item;
    StackNode* temp = topPtr;
    topPtr = topPtr->next;

    temp->next = 0;  // safeguard
    delete temp;
 }

 void Stack::getTop(StackItemType& stackTop) const
    throw(OutOfDataException) {

    if (isEmpty() ) {
       throw OutOfDataException("Cannot get the top of an empty stack.");
    }
    stackTop = topPtr->item;
 }

  void Stack::popAndDiscard(int count) {

    while (count>0 && !isEmpty()) {

      pop();
      count--;
      }//end while

    }// end popAndDiscard

StackP.h:

#ifndef STACKP_H
 #define STACKP_H 1

 #include "OutOfStorageException.h"
 #include "OutOfDataException.h"

 typedef int StackItemType;

 class Stack {
 public:

    Stack();

    Stack(const Stack& aStack)
       throw(OutOfStorageException);

    ~Stack();

    bool isEmpty() const;

    void push(const StackItemType& newItem)
       throw(OutOfStorageException);

    void pop()
       throw(OutOfDataException);

    void pop(StackItemType& stackTop)
       throw(OutOfDataException);

    void getTop(StackItemType& stackTop) const
       throw(OutOfDataException);

    void popAndDiscard(int count);


 private:

    struct StackNode {
       StackItemType item;

       StackNode* next;
    };

    StackNode* topPtr;
 };

  #endif 

在此先感谢您的帮助!

4

1 回答 1

2

您应该按照@WhozCraig 的建议添加打印功能:

void print(std::ostream& os)
{
    StackNode* current = topPtr;
    while(current != NULL)
    {
        os<<current->item<< " ";
        current = current->next;
    }
}

不要忘记#include <ostream>

于 2013-03-11T20:41:48.913 回答