2 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
“Stack extends Vector”从语义上意味着:堆栈是个向量 或者 堆栈属于向量。
其实从现实生活中,并不会认为堆栈是从向量衍伸而来的,所以这种继承关系会让人从语义上觉得奇怪。
有点像是:某人为了贪图方便,定义猴子的时候,直接从人类继承过来了;结果语义变成了 猴子属于人类。
Effective java上说继承有自己的一些原则,但是显然栈并不是向量,所以栈不应该扩展向量。同样的,Properties不应该继承HashTable.这样回导致子类拥有一些父类的方法,逻辑奇怪也可能出现歧义。
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
vector可以替代stack,stack仅支持一端操作(push,pop),而vector除此之外(push_back,pop_back)还支持中间插入(insert)、‘移除(erase),所以要用vector替代stack如有:
/* struct TreeNode { int val; TreeNode *left; TreeNode *right; }; */ stack<TreeNode*> s; 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); } } |
想直接替换可以改为:
vector<TreeNode*> s; 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<T> > class stack; |
这里的Container必须supports the following operations:
front() back() push_back() pop_back() |
而vector就满足这些条件,所以要用vector替代deque作为stack的底层容器,只需这样定义即可:
stack<TreeNode*, vector<TreeNode*> > stk; |
添加回答
举报
0/150
提交
取消