栈和队列常考面试题(一)
2016-09-17 14:25
323 查看
1. 实现一个栈,要求实现出栈,入栈,Min返回最小值的操作的时间复杂度为o(1)
思路:要使这些操作的时间复杂度为o(1),则必须保证栈的每个元素只被遍历一次。求解时需要借助两个栈,一个入数据,一个入所遍历过数据的最小值,遍历结束后,放最小值的栈的栈顶元素即为所求的最小值。
#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>
#define capacity 10
template<class T>
class StackWithMin
{
public:
void Push(const T&value)
{
m_data.push(value);
if (m_min.size() == 0 || value < m_min.top())
m_min.push(value);
else
m_min.push(m_min.top());
}
void Pop()
{
assert(m_data.size >0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
T Min()const
{
assert(m_data.size() >0 && m_min.size() > 0);
return m_min.top();
}
private:
stack<T> m_data; //数据栈
stack<T> m_min; //最小的数据栈
};
//测试
void main()
{
StackWithMin<int> st;
st.Push(9);
st.Push(2);
st.Push(6);
st.Push(4);
st.Push(3);
cout << st.Min() << endl;
}
2.用两个栈实现一个队列
思路:定义两个栈st1,st2,st1栈专门入数据,st2栈专门出数据。无论st1有没有数据直接入数据,如果st2有数据则出数据,没有数据则将st1的数据“倒入”st2中
#include<iostream>
using namespace std;
#include<stack>
template<class T>
class CQueue
{
public:
void appendTail(const T&x) //从队尾插入数据
{
st1.push(x);
}
T deleteHead() //删除头结点
{
if (st2.size() <= 0)
{
while (!st1.empty())
{
T value=st1.top();
st1.pop();
st2.push(value);
}
}
if (st2.size() > 0)
{
T head = st2.top();
st2.pop();
return head;
}
}
private:
stack<T> st1;
stack<T> st2;
};
//测试
void main()
{
CQueue<int> cq;
cq.appendTail(1);
cq.appendTail(2);
cq.appendTail(3);
cq.appendTail(4);
cout << cq.deleteHead() << endl;
}
3.用两个队列实现一个栈
思路:一个队列q1专门负责入数据,只要有数据就入,将队列q1中的元素入到辅助队列q2中,直到q1中只剩下最后一个元素,将这个元素出队列,即实现了出栈
#include<iostream>
using namespace std;
#include<queue>
template<class T>
class CStack
{
public:
void appendHead(const T&x) //从栈顶插入元素
{
q1.push(x);
}
T deleteTail() //从栈顶删除元素
{
if (q2.size() <= 0)
{
while (q1.size()-1)
{
T value = q1.front();
q1.pop();
q2.push(value);
}
}
T tail = q1.front();
q1.pop();
return tail;
}
private:
queue<T> q1;
queue<T> q2;
};
//测试
void main()
{
CStack<int> st;
st.appendHead(5);
st.appendHead(2);
st.appendHead(3);
st.appendHead(9);
st.appendHead(3);
st.appendHead(2);
cout << st.deleteTail() << endl;
}
思路:要使这些操作的时间复杂度为o(1),则必须保证栈的每个元素只被遍历一次。求解时需要借助两个栈,一个入数据,一个入所遍历过数据的最小值,遍历结束后,放最小值的栈的栈顶元素即为所求的最小值。
#include<iostream>
using namespace std;
#include<stack>
#include<assert.h>
#define capacity 10
template<class T>
class StackWithMin
{
public:
void Push(const T&value)
{
m_data.push(value);
if (m_min.size() == 0 || value < m_min.top())
m_min.push(value);
else
m_min.push(m_min.top());
}
void Pop()
{
assert(m_data.size >0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
T Min()const
{
assert(m_data.size() >0 && m_min.size() > 0);
return m_min.top();
}
private:
stack<T> m_data; //数据栈
stack<T> m_min; //最小的数据栈
};
//测试
void main()
{
StackWithMin<int> st;
st.Push(9);
st.Push(2);
st.Push(6);
st.Push(4);
st.Push(3);
cout << st.Min() << endl;
}
2.用两个栈实现一个队列
思路:定义两个栈st1,st2,st1栈专门入数据,st2栈专门出数据。无论st1有没有数据直接入数据,如果st2有数据则出数据,没有数据则将st1的数据“倒入”st2中
#include<iostream>
using namespace std;
#include<stack>
template<class T>
class CQueue
{
public:
void appendTail(const T&x) //从队尾插入数据
{
st1.push(x);
}
T deleteHead() //删除头结点
{
if (st2.size() <= 0)
{
while (!st1.empty())
{
T value=st1.top();
st1.pop();
st2.push(value);
}
}
if (st2.size() > 0)
{
T head = st2.top();
st2.pop();
return head;
}
}
private:
stack<T> st1;
stack<T> st2;
};
//测试
void main()
{
CQueue<int> cq;
cq.appendTail(1);
cq.appendTail(2);
cq.appendTail(3);
cq.appendTail(4);
cout << cq.deleteHead() << endl;
}
3.用两个队列实现一个栈
思路:一个队列q1专门负责入数据,只要有数据就入,将队列q1中的元素入到辅助队列q2中,直到q1中只剩下最后一个元素,将这个元素出队列,即实现了出栈
#include<iostream>
using namespace std;
#include<queue>
template<class T>
class CStack
{
public:
void appendHead(const T&x) //从栈顶插入元素
{
q1.push(x);
}
T deleteTail() //从栈顶删除元素
{
if (q2.size() <= 0)
{
while (q1.size()-1)
{
T value = q1.front();
q1.pop();
q2.push(value);
}
}
T tail = q1.front();
q1.pop();
return tail;
}
private:
queue<T> q1;
queue<T> q2;
};
//测试
void main()
{
CStack<int> st;
st.appendHead(5);
st.appendHead(2);
st.appendHead(3);
st.appendHead(9);
st.appendHead(3);
st.appendHead(2);
cout << st.deleteTail() << endl;
}
相关文章推荐
- 十大编程算法助程序员走上高手之路
- java算法面试题
- sql 面试题 函数 求工资第n多的工资
- [转]招聘一个靠谱的iOS面试题
- Java程序员必须掌握的8大排序算法
- 2016Android某公司面试题
- 求和为n的连续正整数【经典面试题】
- leetcode-1. Two Sum-简单的算法题,面试见到了吗?
- 面试笔试---数据库知识点
- 面试心得与总结-——答案整理
- 一道网易web前端校招面试题的问题?
- 3年安卓经验面试总汇
- 面试题5:JS实现从尾到头打印单链表
- 面试笔试--操作系统知识点
- 面试装13大法合集
- 面试坑你的问题(测试工程师)
- 不用任何比较判断找出两个数中较大的数。
- android面试题总结
- java面试题(9月17日)
- 职场上该用什么心态,面对不喜欢的工作