栈和队列相关面试题
来源:互联网 发布:文学书籍推荐知乎 编辑:程序博客网 时间:2024/05/16 07:05
1,用两个栈实现一个队列
template<class T>class CQuee{public:CQuee(){}~CQuee(){}void Push(const T& node);T Pop();private:stack<T> stack1;stack<T> stack2;};template<class T>void CQuee<T>::Push(const T& node){stack1.push(node);}template<class T>T CQuee<T>::Pop(){T tmp = 0;if (stack2.empty()){while (!stack1.empty()){tmp = stack1.top();stack2.push(tmp);stack1.pop();}}tmp = stack2.top();stack2.pop();return tmp;}void TestCQuee(){CQuee<int> cq;cq.Push(1);cq.Push(2);cq.Push(3);cq.Push(4);cout<<cq.Pop()<<endl;}
2,使用两个队列实现一个栈
template<class T>class Stack{public:void Push(const T& data);T Pop();int Getnum()const;Stack(){_count = 0;}private:queue<T> q1;queue<T> q2;int _count;};template<class T>int Stack<T>::Getnum()const{return _count;}template<class T>void Stack<T>::Push(const T& data){if (q1.size() == 0 && q2.size() == 0){q1.push(data);}else if (q1.size() > 0)//q1不为0,q2为0时,将数据插入q1{q1.push(data);}else//q1为0,q2不为0时,将数据插入q2{q2.push(data);}++_count;}template<class T>T Stack<T>::Pop(){T ret;if (q2.size() == 0){while (q1.size() != 1){T& data = q1.front();q1.pop();q2.push(data);}ret = q1.front();q1.pop();cout << ret << endl;}else{while (q2.size() != 1){T & data = q2.front();q2.pop();q1.push(data);}ret = q2.front();q2.pop();cout << ret << endl;}--_count;return ret;}void TestStack(){Stack<int> s;s.Push(1);s.Push(2);s.Push(3);s.Push(4);s.Pop();}
3,使用一个数组实现两个栈
#include<assert.h>enum Stack{First,Second,};template<class T>class ArrayStack{public:ArrayStack():_n(5), _a(new T[_n]), size1(0), size2(_n - 1){}~ArrayStack(){if (_a){delete _a;_a = NULL;}}void Push(Stack s, T data){assert(_a);if (size1 > size2){_Expand();}if (s == First){_a[size1++] = data;}else{_a[size2--] = data;}}void Pop(Stack s){if (s == First){if (size1 == NULL){cout << "Stack1 is empty" << endl;return;}--size1;}else if (s == Second){if (size2 == _n-1){cout << "Stack2 is empty" << endl;return;}++size2;}}protected:void _Expand(){size_t n = _n;_n *= 2;T* tmp = new T[_n];for (size_t i = 0; i < size1; ++i){tmp[i] = _a[i];}size_t newsize = n - size2;//保存栈2的元素个数size2 += n + 1;//将栈2的栈顶指针相应的向后移动增加的字节数//将栈2中旧空间的内容拷贝到新空间中for (size_t i = _n - 1; --size2; --i){tmp[i] = _a[--n];//注意循环条件和赋值方式}size2 = _n - newsize;delete[]_a;//释放旧空间swap(_a, tmp);//指向新空间}private:size_t _n;T* _a;size_t size1;//栈1的栈顶下标size_t size2;//栈2的栈顶下标};
4,实现一个栈,要求实现Push,Pop,Min(返回最小值)的操作的时间复杂度是O(1)
template<class T>class StackMin{public:StackMin(){}~StackMin(){}void Push(const T& x){s.push(x);if (min.empty() || x <= min.top()){min.push(x);}}void Pop(){if (s.empty())return;if (s.top() == min.top())min.pop();s.pop();}T Min(){return min.top();}protected:stack<T> s;stack<T> min;//用来存放最小元素};void TestStackMin(){StackMin<int> s;s.Push(4);s.Push(3);s.Push(5);s.Push(1);s.Push(1);s.Push(2);s.Pop();s.Pop();}
阅读全文
1 0
- 栈和队列 相关 面试题
- 栈和队列相关面试题2
- 队列和栈相关面试题总结
- 栈和队列的相关面试题
- 栈和队列相关面试题
- 栈和队列的相关面试题
- 栈和队列相关面试题(1)
- 栈和队列相关面试题(2)
- 栈和队列相关面试题(3)
- 栈和队列相关面试题(1)
- 【程序员面试宝典】栈和队列相关面试题
- 栈与队列相关面试题
- 栈和队列面试题
- 栈和队列面试题
- 栈和队列面试题
- 【面试题】栈和队列的面试题
- 栈和队列面试题总结
- 【面试题七】栈和队列
- 学习笔记-LVS的三种模式以及优缺点
- JavaSE-RxJava2笔记
- C#设计模式(6)——原型模式(Prototype Pattern)
- 《敦刻尔克》与《比利林恩的中场战事》——与战争中的人感同身受
- django 保存的时间与当前时间不一致
- 栈和队列相关面试题
- python语法小细节及小定义(一)
- Struts2 官方教程:AJAX
- 新华三面试总结(一)
- Codeforces 864D Round#436D :全排列乱搞
- 机器学习入门推荐
- varnish原理及配置
- 刷题训练——气球
- 大小端模式