vector可以替代stack,stack仅支持一端操作(push,pop),而vector除此之外(push_back,pop_back)还支持中间插入(insert)、‘移除(erase),所以要用vector替代stack如有:
/*
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
};
*/
stacks;
s.push(root);
while(!s.empty()) {
TreeNode *tmp = s.top();
if(tmp != NULL) {
cout << tmp->val; // visit node.
s.push(tmp->right);
s.push(tmp->left);
}
}
想直接替换可以改为:
vectors;
s.push_back(root);
while(!s.empty()) {
TreeNode *tmp = s.back();
if(tmp != NULL) {
cout << tmp->val; // visit node.
s.push_back(tmp->right);
s.push_back(tmp->left);
}
}
在STL中stack本身就是一个容器适配器,默认情况是以deque实现:
template < class T, class Container = deque> class stack;
这里的Container必须supports the following operations:
front()
back()
push_back()
pop_back()
而vector就满足这些条件,所以要用vector替代deque作为stack的底层容器,只需这样定义即可:
stack> stk;
关于C++标准库的细节可以参考C++官方参考:
http://www.cplusplus.com/reference/ (涵盖C++11标准)
这里有一份离线版,可以下载:
http://www.kuaipan.cn/file/id_34843416110039117.htm (C++0x标准)
“Stack extends Vector”从语义上意味着:堆栈是个向量 或者 堆栈属于向量。
其实从现实生活中,并不会认为堆栈是从向量衍伸而来的,所以这种继承关系会让人从语义上觉得奇怪。
有点像是:某人为了贪图方便,定义猴子的时候,直接从人类继承过来了;结果语义变成了 猴子属于人类。
Effective java上说继承有自己的一些原则,但是显然栈并不是向量,所以栈不应该扩展向量。同样的,Properties不应该继承HashTable.这样回导致子类拥有一些父类的方法,逻辑奇怪也可能出现歧义。