您的位置:首页 > 其它

1.用两个栈实现队列 2.用两个队列实现一个栈

2015-04-23 15:53 274 查看
1.用两个栈实现队列

编程思想:添加元素全都放入栈sta,出栈元素都从栈stb退出。当stb非空时,直接进行元素出栈实现队列。只有在栈stb为空,且sta非空的情况下,将sta中所有的元素一次性加入stb,(stb为空,sta为空,队列空)再进行元素出栈。

Quene核心代码
void  appendTail( ElementType data)//入队
{
stack1.push(data);
}
ElementType   deleteHead()//出队
{
if(stack2.size()==0)
{
while(stack1.size()>0)
{
temp=stack1.top;
stack2.push(temp);
stack1.pop();
}
}
if(stack2.size()==0)
cout<<"queue empty!";
head=stack2.top();
stack2.pop();
return head;
}
实现代码:
#include <iostream>
#include <vector>
using namespace std;
typedef int elemType;
class Stack
{
public:
vector<elemType> vec;//用vector实现栈
public:
void push(elemType data)//入栈
{
vec.push_back(data);
}
elemType  top()//返回栈顶元素值
{
if(vec.size())
return vec.back();
else
cout<<"stack empty!"<<endl;
}
void pop()//删除栈顶元素
{
if(vec.size())
vec.pop_back();
else
cout<<"stack empty!"<<endl;
}

elemType size()//栈大小
{
return vec.size();
}
bool empty()//栈是否为空
{
return vec.empty();
}
}  ;
class Queue
{
public:
Stack sta;
Stack stb;
public:

void push(elemType data)//入队
{
sta.push(data);
}
elemType front()//返回对首元素的值
{
while(stb.size()==0)
{
while(sta.size()!=0)
{
stb.push(sta.top());
sta.pop();
}
}
if(stb.size()==0)
cout<<"queue empty!"<<endl;

return stb.top();

}
void pop()//删除队首元素
{
if(stb.size()!=0)
stb.pop();
}
elemType size()//队列的大小
{
return sta.size()+stb.size();
}
bool empty()//队列是否为空
{
if(sta.size()+stb.size()==0)
return true;
else
return false;
}

};
int main()
{
Queue que;
for(int i=1;i<=5;i++)
que.push(i);
for(int i=1;i<=3;i++)
{
cout<<que.front()<<" ";
que.pop();

}
que.push(6);
que.push(7);

cout<<endl<<que.size()<<endl;

for(int i=1;i<=4;i++)
{
cout<<que.front()<<" ";
que.pop();
}
return 0;
}

同样可以利用系统提供的适配器stack
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
typedef int elemType;

class Queue
{
public:
stack<int> sta;
stack<int> stb;
public:
void push(elemType data)//入队
{
sta.push(data);
}
elemType front()//返回对首元素的值
{
while (stb.size() == 0)
{
while (sta.size() != 0)
{
stb.push(sta.top());
sta.pop();
}
}
if (stb.size() == 0)
cout << "queue empty!" << endl;

return stb.top();

}
void pop()//删除队首元素
{
if (stb.size() != 0)
stb.pop();
}
elemType size()//队列的大小
{
return sta.size() + stb.size();
}
bool empty()//队列是否为空
{
if (sta.size() + stb.size() == 0)
return true;
else
return false;
}
};
int main()
{
Queue que;
for (int i = 1; i <= 5; i++)
que.push(i);
for (int i = 1; i <= 3; i++)
{
cout << que.front() << " ";
que.pop();
}
que.push(6);
que.push(7);
cout << endl << que.size() << endl;

for (int i = 1; i <= 4; i++)
{
cout << que.front() << " ";
que.pop();
}
return 0;
}


2.两个队列实现一个栈

编程思想:

添加元素全都放入队列que1,(假如有三个元素abc依次进入que1,如果想要删除栈顶元素,则将que1中元素ab已入que2中,此时que1中只有一个元素c,输出c)整体采用类似思想。因为每次都是从que1加入元素,所以每次先判断que1中元素个数n(后入先出),如果为n=1,直接输出,n>1的话将将其与n-1个元素转移到que2在输出剩下一个元素。如过n=0,则判断que2中元素个数m,如果为m=1,直接输出,m>1的话将将其与m-1个元素转移到que1,在输出剩下一个元素。

若n=0,m=0,栈空。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef int elemType;
class Stack
{
public:
queue<int> que1;
queue<int> que2;
public:
void push(elemType data)//入栈
{
que1.push(data);
}
elemType  top()//返回栈顶元素值  同时删除
{
if (que1.size() + que2.size() == 0)
{
cout << "stack empty!" << endl;
return 0;
}
while (que1.size() > 1)
{
que2.push(que1.front());
que1.pop();
}
if (que1.size() == 1)
{
int temp=que1.front();
que1.pop();
return temp;
}
while (que2.size() > 1)
{
que1.push(que2.front());
que2.pop();
}
if (que2.size() == 1)
{
int temp = que2.front();
que2.pop();
return temp;
}

}
void pop()//删除栈顶元素只能在top内实现,因为每次删除元素所在队列不确定。
{

}
int size()
{
return que1.size() + que2.size();
}
bool empty()
{
if (que1.size() + que2.size() == 0)
{
return true;
}
return false;
}

}  ;
int main()
{
Stack sta;
for (int i = 1; i <= 5; i++)
sta.push(i);
for (int i = 1; i <= 3; i++)
{
cout << sta.top() << " ";

}
sta.push(6);
sta.push(7);
cout << endl << sta.size() << endl;

for (int i = 1; i <= 4; i++)
{
cout << sta.top() << " ";
}
system("pause");
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: