鉴于链表模板类
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
答案 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()
的实现需要更加谨慎,因为这些函数需要随时跟踪堆栈中的最小值和最大值(我假设这是你想要的有max
和min
)。 (有点伪代码)可能如下所示:
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;在头部也是如此。