/*
队列元素逆置:一个栈和一个队列
说明:
1、代码中初始化队列使用#作为输入结束标志
2、使用的队列是循环队列
3、在函数中如果要改变结构体中的变量值,必须在形参结构体中加入&,否则操作无效
4、长度为n的队列只能放入n-1个元素
1、
*/
#include <iostream>
#include <cstdlib>
using namespace std;
const int MAXSIZE = 100;
typedef char ElemType;
typedef struct SqStack{
ElemType data[MAXSIZE];
int top;
};
typedef struct SqQueue{
ElemType data[MAXSIZE];
int front, rear;
};
//栈空
bool EmptyStack(SqStack s){
if(s.top==-1)
return true;
return false;
}
//栈满
bool FullStack(SqStack s){
if(s.top==MAXSIZE-1)
return true;
return false;
}
//栈初始化
void InitStack(SqStack &s){
s.top = -1;
}
//入栈
void Push(SqStack &s, ElemType e){
if(FullStack(s)){
cout << "栈满" << endl;
return;
}
s.data[++s.top] = e;
}
//出栈
void Pop(SqStack &s, ElemType &e){
if(EmptyStack(s)){
cout << "栈空" << endl;
return;
}
e = s.data[s.top--];
}
//判队满
bool FullQueue(SqQueue q){
if((q.rear+1)%MAXSIZE == q.front)
return true;
return false;
}
//判队空
bool EmptyQueue(SqQueue q){
if(q.rear == q.front)
return true;
return false;
}
//入队
void EnQueue(SqQueue &q, ElemType e){
if(FullQueue(q)){
cout << "队满" << endl;
return;
}
q.data[q.rear] = e;
q.rear = (q.rear+1)%MAXSIZE;
}
//队列初始化
void InitQueue(SqQueue &q){
char c;
q.front = q.rear = 0;
while((c=getchar())!='#'){
if(FullQueue(q)){
break;
}
EnQueue(q, c);
}
}
//出队
void DeQueue(SqQueue &q, ElemType &e){
e = q.data[q.front];
q.front = (q.front+1)%MAXSIZE;
}
//输出队列
void PrintQueue(SqQueue q){
if(EmptyQueue(q)){
cout << "队空" << endl;
return;
}
int i;
if(q.rear>q.front){ //队尾在对头后
for(i=q.front; i<q.rear; i++)
cout << q.data[i] << " ";
cout << endl;
}else{ //队尾在队头前
for(i=q.front; i<MAXSIZE; i++)
cout << q.data[i] << " ";
for(i=0; i<q.rear; i++)
cout << q.data[i] << " ";
cout << endl;
}
}
int main(){
SqQueue q;
SqStack s;
ElemType e;
InitStack(s);
InitQueue(q);
PrintQueue(q);
while(!EmptyQueue(q)){
DeQueue(q, e);
Push(s, e);
}
while(!EmptyStack(s)){
Pop(s, e);
EnQueue(q, e);
}
PrintQueue(q);
return 0;
}
程序小白,如果代码有任何问题,欢迎指出。