vector stack(堆栈)有什么不一样和一样的地方?

2025-02-27 11:18:30
推荐回答(2个)
回答1:

vector可以替代stack,stack仅支持一端操作(push,pop),而vector除此之外(push_back,pop_back)还支持中间插入(insert)、‘移除(erase),所以要用vector替代stack如有:

/*
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
};
*/
stack 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 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 > 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标准)

回答2:

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