两个栈实现一个队列
#pragma once
#include<stdio.h>
#include<Windows.h>
#include<assert.h>
#include<iostream>
#include<stack>
using namespace std;
stack<int> s1, s2;//两个栈s1和s2
class Newqueue
{
public:
void PushQueue(int value)
{
s1.push(value);//入栈就入s1
}
int& PopQueue(stack<int> &s1, stack<int> &s2, int& value)
{
if (s2.empty())//s2里面没有元素
{
int size = s1.size();
for (int i = 0; i < size; i++)//把s1元素全部搬到s2里面去
{
s2.push(s1.top());
s1.pop();
}
}
value = s2.top();//此时s1的栈底变成s2的栈顶
s2.pop();
return value;
}
void Remove(stack<int> &s1, stack<int> &s2)//搬移元素
{
int size = s1.size();
for (int i = 0; i < size; i++)//把s1元素全部搬到s2里面去
{
s2.push(s1.top());
s1.pop();
}
}
void Print()//先输出s2的,再把s1的倒腾到s2,然后在进行输出
{
if (s2.empty())//s2里面没有元素
{
Remove(s1, s2);//搬元素
}
int size = s2.size();
while (size)//输出s2元素
{
cout << s2.top() << " ";
s2.pop();
--size;
}
if (!s1.empty())//s1不为空
{
Remove(s1, s2);//搬元素
}
int size1 = s2.size();
while (size1)//再次输出
{
cout << s2.top() << " ";
s2.pop();
--size1;
}
}
};
int main()
{
int Top;
Newqueue q;
q.PushQueue(1);
q.PushQueue(2);
q.PushQueue(3);
q.PushQueue(4);
q.PushQueue(1);
q.PushQueue(2);
q.PushQueue(3);
q.PushQueue(4);
q.PopQueue(s1,s2,Top);
q.Print();
system("pause");
return 0;
}
两个队列实现一个栈(模板)
#define _CRT_SECURE_NO_WARNINGS 1
#include<queue>
#include<stdio.h>
#include<iostream>
using namespace std;
template <class T>
class NewStack
{
public:
void PushStack(const T& value)
{
if (q1.empty() && q2.empty())//如果两个队列都为空,则入q1
{
q1.push(value);
}
else if (q1.size())//q1不为空,则入q1
{
q1.push(value);
}
else if (q2.size())//此时的q1为空,q2不为空
{
q2.push(value);
}
}
T PopStack()
{
T ret;
if (q1.size())
{
Removeq1q2();//现在q1只剩最后一个元素
ret = q1.front();
q1.pop();//出队列
return ret;
}
else if (q2.size())//同上
{
Removeq2q1();
ret = q2.front();
q2.pop();
return ret;
}
}
void Removeq1q2()//从q1往q2搬元素,搬得只剩一个
{
int count = q1.size();
while (count>1)
{
q2.push(q1.front());
q1.pop();
--count;
}
}
void Removeq2q1()//q2->q1 搬得只剩一个
{
int count = q2.size();
while (count>1)
{
q1.push(q2.front());
q2.pop();
--count;
}
}
void Print()
{
while (q1.size() || q2.size())//注意这里是一个顺序循环的过程,直至元素全部输出
{
while (q1.size()>1)
{
Removeq1q2();
}
if (!q1.empty())
{
cout << q1.front() << " ";
q1.pop();
}
while (q2.size()>1)
{
Removeq2q1();
}
if (!q2.empty())
{
cout << q2.front() << " ";
q2.pop();
}
}
}
queue<T> q1, q2;
};
int main()
{
NewStack<char> s1;
s1.PushStack( 'a');
s1.PushStack( 'b');
s1.PushStack( 'c');
s1.PushStack( 'd');
s1.PushStack( 'f');
s1.PopStack();
s1.Print();
cout << endl;
NewStack<int> s2;
s2.PushStack(1);
s2.PushStack(2);
s2.PushStack(3);
s2.PushStack(4);
s2.PushStack(5);
s2.PopStack();
s2.Print();
system("pause");
return 0;
}