给定LinkedList模板类定义如何在C ++中定义Stack类?

时间:2014-01-21 14:01:55

标签: c++ linked-list stack header-files

鉴于链表模板类

template <typename dataType> 

class List{

private:
    struct Node{
        Node *next;
        dataType data;
    };

public:
    //constructer
    List();
    List(const List& aList); //copy constructer for deep copy
    List(Node *head);

    //destructor
    ~List();

    //operations
    bool isEmpty();
    int getLength();
    void insert(int index, dataType data);
    void remove(int index);
    dataType retrieve(int index);
    dataType extract(int index); /*get the value and remove the node */ 
    void printList();
    void removeDuplicates();
    void randomIntFill(int item_num, int max);
    void removeNode(Node* node);
    Node* find(int index);
    Node* sumDigitsWithCarry(Node* head1, Node* head2); // given two list of digits sum those lists
                               // like they are natural numbers with given 1o's order
                               // 9 -> 5 + 9 -> 4 = 8 -> 0 -> 1 = 108

private:    
    int size;
    Node *head;
};

如何在Stack类的定义中使用其函数?这是我目前的定义,但在执行时出现了一些问题。

template <class T>
class Stack{

public:
    ~Stack();
    Stack();

    int getSize();
    T pop();
    void push(T newVal);
    T getMin();
    T getMax();
    void stackPrint();

private:
    T max;
    T min;
    int size;
    List<T> list;   
};

如果这两个.h文件没问题,我也会提供.cpp文件。

解决我的问题: 这位于以下entry

1 个答案:

答案 0 :(得分:1)

鉴于您的Stack班级成员,int Stack::getSize()T Stack::getMin()T Stack::getMax()可能只是作为相应私有类变量的getter实现。请注意,如果您愿意,也可以int Stack::getSize()实施int List::getLength()

T Stack::pop()void Stack::push()的实现需要更加谨慎,因为这些函数需要随时跟踪堆栈中的最小值和最大值(我假设这是你想要的有maxmin)。 (有点伪代码)可能如下所示:

public:

    T pop()
    {
        list.
    }

    void push(T newVal)
    {
        // You may need to update the current min and max values
        if( newVal > this.max )
            max = newVal;
        else if ( newVal < this.min )
            min = newVal;

        // Insert the new value at the end the list
        list->insert(this.size - 1, newVal);
        size += 1
    }

    T pop()
    {
        T popped = list.extract(size - 1);

        // TODO: if popped is equal to the min or the max value, you need
        // to iterate through the whole list to get an updated min or max

        size -= 1;
        return popped;
    }

但是,您应该知道列表和堆栈是完全不同的数据结构,并且在最糟糕的情况下,如在我提议的实现中那样在列表顶部实现堆栈是非常低效的。特别是,pop()和push()可以实现在堆栈上的O(1)时间运行,而如果依赖于底层列表操作,它们很可能最终以O(n)时间复杂度运行(尽管你可以通过在推送时在列表的头部插入元素来避免它,并且在弹出时提取&#34;在头部也是如此。