为了账号安全,请及时绑定邮箱和手机立即绑定

关于vector stack(堆栈)有什么区别吗?

关于vector stack(堆栈)有什么区别吗?

HUH函数 2021-12-15 14:11:53
vector 可以代替stack 使用么,怎么代替成员函数有什么?对应什么?
查看完整描述

2 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

  “Stack extends Vector”从语义上意味着:堆栈是个向量 或者 堆栈属于向量。
  其实从现实生活中,并不会认为堆栈是从向量衍伸而来的,所以这种继承关系会让人从语义上觉得奇怪。
  有点像是:某人为了贪图方便,定义猴子的时候,直接从人类继承过来了;结果语义变成了 猴子属于人类。
  Effective java上说继承有自己的一些原则,但是显然栈并不是向量,所以栈不应该扩展向量。同样的,Properties不应该继承HashTable.这样回导致子类拥有一些父类的方法,逻辑奇怪也可能出现歧义。

查看完整回答
反对 回复 2021-12-19
?
摇曳的蔷薇

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;



查看完整回答
反对 回复 2021-12-19
  • 2 回答
  • 0 关注
  • 557 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信