栈模拟队列、队列模拟栈
2016-01-06 18:04
330 查看
为实现简便,假设栈不会溢出.
1.两个栈模拟队列
s1负责入队,s2负责出队.
入队时:直接压入s1
出队时:判断s2是否有元素,若有则弹出,若没有,则将s1倒入s2,再将s2栈顶弹出。若s1、s2均为空,则队列为空。
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
//栈模拟队列
void enqueue(stack<int> *s1, stack<int> *s2, int k){
s1->push(k);
}
int dequeue(stack<int> *s1, stack<int> *s2){
int ians = -1;
if (s2->empty())
{
while (!s1->empty())
{
ians = s1->top();
s1->pop();
s2->push(ians);
}
}
if (s2->empty()){
cout << "empty" << endl;
}
ians = s2->top();
s2->pop();
return ians;
}
int _tmain(int argc, _tchar* argv[])
{
stack<int> s1;
stack<int> s2;
enqueue(&s1, &s2, 1);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 3);
enqueue(&s1, &s2, 2);
enqueue(&s1, &s2, 1);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 2);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 3);
cout << dequeue(&s1, &s2) << endl;
cout << dequeue(&s1, &s2) << endl;
cout << dequeue(&s1, &s2) << endl;
system("pause");
return 0;
}
2.两个队列模拟栈
入栈:直接进入q1
出栈:把q1转入q2,当队长为1时,出队,再将q2退回q1,恢复顺序
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
//队列模拟栈
void Push(queue<int> *q1, queue<int> *q2, int k){
q1->push(k);
}
int Pop(queue<int> *q1, queue<int> *q2){
int iAns = -1;
if (q1->empty()){
cout << "Empty" << endl;
}
else
{
while (q1->size() != 1)
{
iAns = q1->front();
q1->pop();
q2->push(iAns);
}
iAns = q1->front();
q1->pop();
while (!q2->empty())
{
q1->push(q2->front());
q2->pop();
}
}
return iAns;
}
int _tmain(int argc, _TCHAR* argv[])
{
queue<int> q1;
queue<int> q2;
Push(&q1, &q2, 1);
Push(&q1, &q2, 2);
cout << Pop(&q1, &q2) << endl;
Push(&q1, &q2, 3);
cout << Pop(&q1, &q2) << endl;
cout << Pop(&q1, &q2) << endl;
Push(&q1, &q2, 4);
cout << Pop(&q1, &q2) << endl;
system("pause");
return 0;
}
1.两个栈模拟队列
s1负责入队,s2负责出队.
入队时:直接压入s1
出队时:判断s2是否有元素,若有则弹出,若没有,则将s1倒入s2,再将s2栈顶弹出。若s1、s2均为空,则队列为空。
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
//栈模拟队列
void enqueue(stack<int> *s1, stack<int> *s2, int k){
s1->push(k);
}
int dequeue(stack<int> *s1, stack<int> *s2){
int ians = -1;
if (s2->empty())
{
while (!s1->empty())
{
ians = s1->top();
s1->pop();
s2->push(ians);
}
}
if (s2->empty()){
cout << "empty" << endl;
}
ians = s2->top();
s2->pop();
return ians;
}
int _tmain(int argc, _tchar* argv[])
{
stack<int> s1;
stack<int> s2;
enqueue(&s1, &s2, 1);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 3);
enqueue(&s1, &s2, 2);
enqueue(&s1, &s2, 1);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 2);
cout << dequeue(&s1, &s2) << endl;
enqueue(&s1, &s2, 3);
cout << dequeue(&s1, &s2) << endl;
cout << dequeue(&s1, &s2) << endl;
cout << dequeue(&s1, &s2) << endl;
system("pause");
return 0;
}
2.两个队列模拟栈
入栈:直接进入q1
出栈:把q1转入q2,当队长为1时,出队,再将q2退回q1,恢复顺序
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
//队列模拟栈
void Push(queue<int> *q1, queue<int> *q2, int k){
q1->push(k);
}
int Pop(queue<int> *q1, queue<int> *q2){
int iAns = -1;
if (q1->empty()){
cout << "Empty" << endl;
}
else
{
while (q1->size() != 1)
{
iAns = q1->front();
q1->pop();
q2->push(iAns);
}
iAns = q1->front();
q1->pop();
while (!q2->empty())
{
q1->push(q2->front());
q2->pop();
}
}
return iAns;
}
int _tmain(int argc, _TCHAR* argv[])
{
queue<int> q1;
queue<int> q2;
Push(&q1, &q2, 1);
Push(&q1, &q2, 2);
cout << Pop(&q1, &q2) << endl;
Push(&q1, &q2, 3);
cout << Pop(&q1, &q2) << endl;
cout << Pop(&q1, &q2) << endl;
Push(&q1, &q2, 4);
cout << Pop(&q1, &q2) << endl;
system("pause");
return 0;
}
相关文章推荐
- C#线程队列用法实例分析
- 算法系列15天速成 第九天 队列
- C++基于栈实现铁轨问题
- C语言单链队列的表示与实现实例详解
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- mysql 队列 实现并发读
- C#队列Queue用法实例分析
- C#多线程处理多个队列数据的方法
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C#内置队列类Queue用法实例
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- C#通过链表实现队列的方法
- java数据结构之java实现栈
- C#队列Queue多线程用法实例
- C#数据结构与算法揭秘五 栈和队列
- JAVA 虚拟机 栈