1.题目
使用一个栈、一个队列,实现队列中元素的逆置
2.思想
利用队列先进先出,栈先进后出的特性,实现队列元素的逆置
3.源码
先上一个简洁版:
/*
实现队列元素的逆置
*/
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
const int N = 50; //定一个常量
queue<int> que;
stack<int> sta;// stack 用来帮助元素逆置
int main(){
for(int i = 0;i < 10;i++){
que.push(i);
}
//放入栈中
while(!que.empty()){
int front = que.front();
que.pop(); // 出队
sta.push(front);
}
//放入队中
while(!sta.empty()){ //栈非空时
que.push(sta.top());
sta.pop();
}
//输出整个队中的数据
while(!que.empty()){
cout << que.front() <<" ";
que.pop();
}
}
下面上一个不用C++ STL库的代码,使用自己定义的queue和 stack.
/**
1.题目:使用一个栈、一个队列,实现队列中元素逆置的算法
**/
#include <stdio.h>
#define maxSize 1000
typedef struct{
int data[maxSize];//队列元素
int front,rear;//队首,队尾下标
//注:front指向队首元素,rear指向队尾元素的下一个元素
}Queue;
typedef struct{
int data[maxSize];//栈元素
int top;//栈顶指针【指向最后一个元素的下一个元素】
}Stack;
//初始化栈操作
void initStack(Stack &stack){
stack.top = 0;
}
//栈元素入栈操作
void pushStack(Stack &stack,int data){
if(stack.top < maxSize){//如果栈未满
stack.data[stack.top++] = data;
}
else
printf("栈已满!\n");
}
//栈元素出栈操作--->出栈的肯定是栈顶元素--->所以不需要参数
int popStack(Stack &stack){
if(stack.top >= 0){
return stack.data[--stack.top];//返回栈顶元素
}
else return -1;
}
/**-------------------------------队列操作---------------------------------------*/
//初始化队列
void initQueue(Queue &queue){
queue.front = queue.rear = 0;//均指向0
}
//入队操作
void inQueue(Queue &queue,int data){
if((queue.rear+1)%maxSize!=queue.front){//如果队未满
queue.data[queue.rear++] = data;
}
else return;
}
//出队操作-->在队列的头部进行操作
int deQueue(Queue &queue){
if(queue.rear!=queue.front){//如果队不为空
return queue.data[queue.front++] ;
}
else return -1;
}
int main(){
Stack stack;//新建一个栈
Queue queue;//新建一个队列
stack.top = 0;//初始化栈顶指针为0
initQueue(queue);//初始化队列
int i;
int data;
printf("请输入5个数据-->进队\n");
for(i = 0;i< 5;i++){
scanf("%d",&data);
inQueue(queue,data);//进队
}
//将队列中的数据出队、进栈
for(i = 0;i < 5;i++){
pushStack(stack,deQueue(queue));//出队,进栈
}
//将栈中元素出栈,进队--->需要将原队列置空
for(i = 0 ;i< 5;i++){
inQueue(queue,popStack(stack));
}
for(i = 0;i< 5;i++){
printf("%d ",deQueue(queue));
}
printf("\n");
}
4.总结
(1)熟知队列的基本操作名称,并且能够写出基本流程:
//初始化队列
void initQueue(Queue &queue){
queue.front = queue.rear = 0;//均指向0
}
//入队操作
void inQueue(Queue &queue,int data){
if((queue.rear+1)%maxSize!=queue.front){//如果队未满
queue.data[(queue.rear++)%maxSize] = data;
}
else return;
}
(queue.rear++)%maxSize] = data;
}
else return;
}
//出队操作-->在队列的头部进行操作
int deQueue(Queue &queue){
if(queue.rear!=queue.front){//如果队不为空
return queue.data[(queue.front++)%maxSize] ;
}
else return -1;
}
queue.front++)%maxSize] ;
}
else return -1;
}
需要注意的是:在进队或是出队的时候,需要使用取余,避免“假上溢出”
5.熟知栈操作
//初始化栈操作
void initStack(Stack &stack){
stack.top = 0;//这里使用的数值0还是-1和下面的操作是stack.data[++stack.top]还是stack.data[stack.top++]有关系,一定要注意!!
}
stack.data[stack.top++]有关系,一定要注意!!
}
//入栈操作-->参数入栈
void pushStack(Stack &stack,int data){
if(stack.top < maxSize){//如果栈未满
stack.data[stack.top++] = data;
}
else
printf("栈已满!\n");
}