STL-关于栈和队列的面试题
2017-12-13 19:47
260 查看
题目分别为:
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。
2.使用两个栈实现一个队列。
3.使用两个队列实现一个栈。
4.判断元素出栈、入栈顺序的合法性。如:入栈的序列(1, 2, 3, 4, 5),出栈序列为(4, 5, 3, 2, 1)是合法序列,入栈的序列(1, 2, 3, 4, 5),出栈序列为(1, 5, 3, 2, 4)是不合法序列。
5.一个数组实现两个栈。
题目不做讲解,仅为代码参考,如有错误欢迎指正!
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。
2.使用两个栈实现一个队列。
3.使用两个队列实现一个栈。
4.判断元素出栈、入栈顺序的合法性。如:入栈的序列(1, 2, 3, 4, 5),出栈序列为(4, 5, 3, 2, 1)是合法序列,入栈的序列(1, 2, 3, 4, 5),出栈序列为(1, 5, 3, 2, 4)是不合法序列。
5.一个数组实现两个栈。
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。
2.使用两个栈实现一个队列。
3.使用两个队列实现一个栈。
4.判断元素出栈、入栈顺序的合法性。如:入栈的序列(1, 2, 3, 4, 5),出栈序列为(4, 5, 3, 2, 1)是合法序列,入栈的序列(1, 2, 3, 4, 5),出栈序列为(1, 5, 3, 2, 4)是不合法序列。
5.一个数组实现两个栈。
题目不做讲解,仅为代码参考,如有错误欢迎指正!
1.实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。
template <class T> class MinStack { public: void Push(const T& x) { s1.push(x); if (s2.empty() || x <= s2.top()) { s2.push(x); } } void Pop() { if (s1.top() == s2.top()) { s2.pop(); } s1.pop(); } T& Min() { if (!s2.empty()) { return s2.top(); } } protected: stack<T> s1; stack<T> s2; };
2.使用两个栈实现一个队列。
template <class T> class Queue { public: void Push(const T& x) { if (s2.empty()) { s1.push(x); } else { while (!s2.empty()) { T tmp = s2.top(); s1.push(tmp); s2.pop(); } s1.push(x); } } void Pop() { if (s2.empty())//将s1的数据全部倒进s2 { while (!s1.empty()) { T tmp = s1.top(); s2.push(tmp); s1.pop(); } } T tmp = s2.top(); s2.pop(); } protected: stack<T> s1; stack<T> s2; };
3.使用两个队列实现一个栈。
template <class T> class Stack { public: void Push(const T& x) { if (q2.empty()) { q1.push(x); } else { while (!q2.empty()) { T tmp = q2.front(); q1.push(tmp); q2.pop(); } q1.push(x); } } void Pop() { while (q1.size() != 1) { T tmp = q1.front(); q2.push(tmp); q1.pop(); } q1.pop(); } protected: queue<T> q1; queue<T> q2; };
4.判断元素出栈、入栈顺序的合法性。如:入栈的序列(1, 2, 3, 4, 5),出栈序列为(4, 5, 3, 2, 1)是合法序列,入栈的序列(1, 2, 3, 4, 5),出栈序列为(1, 5, 3, 2, 4)是不合法序列。
class LegalStack { public: void Push(const T& x) { s1.push(x); } void Pop() { while (!s2.empty()) { std::cout << s2.top() << " "; s2.pop(); } while (!s1.empty()) { std::cout << s1.top() << " "; s1.pop(); } } void ChangeSort(size_t num = 0) { assert(num < s1.size()); while (num--) { T tmp = s1.top(); if (!s1.empty()) { s2.push(tmp); s1.pop(); } } } protected: stack<int> s1; stack<int> s2; };
5.一个数组实现两个栈。
template <class T> class DoubleStack { public: DoubleStack() :_a(NULL) , _top1(0) , _top2(0) , _capacity(0) {} void CheckCapacity() { if (_a == NULL) { _capacity += 3; _a = new T[_capacity]; _top2 = _capacity - 1; return; } if (_top1 == _top2) { size_t capacity = _capacity; _capacity *= 2; T* tmp = new T[_capacity]; for (size_t i = 0; i < _top1; i++)//把左边的挪下去 { tmp[i] = _a[i]; } for (size_t i = capacity - 1, j = _capacity - 1; i > _top2; i--, j--)//把右边的挪下去 { tmp[j] = _a[i]; } delete[] _a; _a = tmp; _top2 += _capacity/2; } } void Push1(const T& x) { CheckCapacity(); _a[_top1++] = x; } void Push2(const T& x) { CheckCapacity(); _a[_top2--] = x; } void Pop1() { _a[_top1--] = T(); } void Pop2() { _a[_top2++] = T(); } size_t Size1() { return _top1; } size_t Size2() { return _capacity - 1 - _top2; } T& Top1() { return _a[_top1-1]; } T& Top2() { return _a[_top2 + 1]; } void Print() { cout << "Stack1 is: "; for (size_t i = 0; i < _top1; i++) { cout << _a[i] << " "; } cout << endl; cout << "Stack2 is: "; for (size_t i = _capacity-1; i > _top2; i--) { cout << _a[i] << " "; } cout << endl; } protected: T* _a; size_t _top1; size_t _top2; size_t _capacity; };
相关文章推荐
- [STL基础]关于STL的那些面试题
- 关于STL优先级队列的一些应用
- 关于队列和栈的几道面试题
- 关于栈和队列的面试题
- 关于STL中的优先队列
- 关于STL(Queue)队列
- 《关于STL中的list,vector,deque队列容器(written by Flower)》
- 记一道面试题:STL两个栈实现一个队列。
- 关于优先级队列STL
- 又一道关于STL中的vector容器的面试题
- 简单常识——关于 STL 算法
- (转)关于一道1到N自然数排序的华为面试题
- 有关STL使用上的一些注意事项。关于某些函数的参数问题。
- 关于内存对齐的面试题
- O(∩_∩)O~,关于一道面试题的分析与解答
- 面试题7:用两个栈实现队列,队列的声明如下,请实现它的两个函数appendTail和deleteHead, 分别完成在队列尾部插入结点和在队列头部删除节点的功能。
- 《剑指Offer》面试题7:用两个栈实现队列
- 《WCF服务编程》关于“队列服务”一个值得商榷的地方
- 关于数组的几道面试题
- 三道关于面向对象设计的面试题