利用两个栈来实现一个队列,这里用的是自己写的栈、还有队列这两个数据结构。当然还可以利用继承的方式来实现队列,这里目前只有不用继承的方式。
原理:
思路一:
将stack1作为存储空间,将stack2作为临时缓冲区
入队时:直接压入stack1
出队时:将stack1中的元素依次压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再压回给stack1
思路二:
入队时:判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中
出队时:判断stack2是否为空,如果stack2为空,则将stack1中的元素倒入stack2中,在将stack2的栈顶元素弹出,否则,直接弹出stack2的栈顶元素
思路三:
入队时:判断stack1是否为满,没有满就存入stack1
出队时:判断stack2是否为空,如果stack2是空,将stack1依次压入stack2,并弹出最上面的元素,如果stack2不为空,直接弹出最上面的元素
这里的my_queue没有继承my_stack,my_stack相当于是实现了栈的功能,my_queue有两个栈的对象来帮助实现队列的操作。
#include <iostream>
#include <string>
using namespace std;
template<class T>
class my_stack {
private:
T *l;
int top;//用来指向栈顶元素
public:
my_stack():top(-1)
{
l = new T[100];
}
~my_stack()
{
delete l;
}
void pop();
void push(T a);
T top1();
bool isempty();
int size();
};
template<class T>
void my_stack<T>::pop()
{
if (top < 0)
{
cout << "stack is empty,pop is forbidden!" << endl;
//exit(0);
}
else
{
top = top - 1;
}
}
template<class T>
void my_stack<T>::push(T a)
{
if (top == 100-1)
{
cout << "stack is full!" << endl;
//exit(0);
}
else
{
top = top + 1;
l[top] = a;
}
}
template<class T>
T my_stack<T>::top1()
{
if (top != -1)
return l[top] ;
//cout << "stack is empty!" << endl;
//exit(0);
}
template<class T>
bool my_stack<T>::isempty()
{
if (top == -1)
return true;
else
return false;
}
template<class T>
int my_stack<T>::size()
{
return top + 1;
}
/*双栈实现队列思路:
入队时:判断s1是否为满,没有满就存入s1
出队时:判断s2是否为空,如果s2是空,将s1转入s2,弹出,如果s2不为空,直接弹出*/
template<class T>
class my_queue
{
private:
my_stack<T> s1, s2;
public:
my_queue()
{
}
~my_queue()
{
}
void enqueue(T a);
void dequeue();
bool isempty();
int size();
};
template<class T>
int my_queue<T>::size()
{
return s1.size() + s2.size();
}
template<class T>
bool my_queue<T>::isempty()
{
return s1.isempty() && s2.isempty();
}
template <class T>
void my_queue<T>::enqueue(T a)
{
if (s1.top1() == 100 - 1)
cout << "full stack1" << endl;
else
s1.push(a);
}
template <class T>
void my_queue<T>::dequeue()
{
if (s2.isempty())
{
int size = s1.size();//s1的size在操作的时候会改变,所以需要另外赋值出来
for (int i = 0; i < size; i++) {
s2.push(s1.top1());
s1.pop();
}
s2.pop();
}
else
{
s2.pop();
}
}
int main()
{
my_queue<int> q1;
q1.enqueue(1);
q1.enqueue(2);
q1.dequeue();
system("pause");
return 0;
}