由于编者时间以及水平有限,如有错误,敬请斧正 ʘᴗʘ、
本文是对之前栈逆置队列的补充:栈逆置队列
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct
{
int* base;
int front;
int rear;
} SqQueue;
void InitQueue(SqQueue* Q)
{
Q->base = (int*)malloc(sizeof(int) * MAXSIZE);
Q->front = Q->rear = 0;
}
void EnQueue(SqQueue* Q) {
if ((Q->rear + 1) % MAXSIZE == Q->front) {
printf("队列满了");
return;
}
int x,i,j;
printf("你要入几个元素?");
scanf("%d", &i);
for (j = 0; j < i; j++) {
printf("请输入要入队的元素");
scanf("%d", &x);
Q->base[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
}
}
void DelQueue(SqQueue* Q) {
if (Q->front == Q->rear) {
printf("队列空的");
return;
}
printf("出队的元素是:%d", Q->base[Q->front]);
Q->front = (Q->front + 1) % MAXSIZE;
}
void GetHead(SqQueue Q) {
if (Q.front != Q.rear) {
printf("队头元素:%d", Q.base[Q.front]);
}
}
void EnQueue2(SqQueue* Q,int x)
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
{
printf("函数队列满了\n");
return;
}
Q->base[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
}
void DelQueue2(SqQueue* Q,int *e)
{
if (Q->front == Q->rear)
{
printf("队列空的");
return;
}
*e=Q->base[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
}
void PrintQueue(SqQueue Q)
{
while (Q.front != Q.rear)
{
printf("队元素:%d ", Q.base[Q.front]);
Q.front=(Q.front+1)%MAXSIZE;
}
}
typedef struct
{
int *base;
int top;
} SqStack;
void InitStack(SqStack* S)
{
S->base = (int*)malloc(sizeof(int) * MAXSIZE);
S->top = -1;
}
void Push(SqStack* S)
{
int x,i,num;
if (S->top == MAXSIZE-1)
{
printf("栈满了");
return;
}
printf("请输入你要入栈的个数");
scanf("%d",&num);
for(i=0; i<num; i++)
{
S->top++;
printf("请输入你要压入栈的数据:");
scanf("%d", &x);
S->base[S->top] = x;
}
}
void Pop(SqStack* S) {
if (S->top == -1) {
printf("栈空了");
return;
}
printf("弹出的数据:%d", S->base[S->top]);
S->top--;
}
void GetTop(SqStack* S) {
if (S->top != -1)
printf("栈顶的数据:%d", S->base[S->top]);
else
printf("栈空了");
}
void Push2(SqStack* S,int x)
{
if (S->top == MAXSIZE-1)
{
printf("栈满了");
return;
}
S->top++;
S->base[S->top] = x;
}
void Pop2(SqStack* S,int *e)
{
if (S->top == -1)
{
printf("栈空了");
return;
}
*e=S->base[S->top];
S->top--;
}
void PrintStack(SqStack* S) {
if (S->top == S->base) {
printf("栈空了");
return;
}
while (S->top != -1) {
printf("数据:%d\n", S->base[S->top]);
S->top--;
}
}
void ReQueue(SqQueue *Q,SqStack *S)
{
int e;
while(Q->front!=Q->rear)
{
DelQueue2(Q,&e);
Push2(S,e);
}
while(S->top!=-1)
{
Pop2(S,&e);
EnQueue2(Q,e);
}
}
int main()
{
SqQueue Q;
InitQueue(&Q);
SqStack S;
InitStack(&S);
SqStack ReS;
InitStack(&ReS);//定义了专用的逆置栈
int input;
do
{
printf("\n\n\n\n");
printf("\t\t|-------------------------------------------------------------|\n");
printf("\t\t| |\n");
printf("\t\t| ====================== |\n");
printf("\t\t| |\n");
printf("\t\t| 1.数据入队 |\n");
printf("\t\t| 2.数据出队 |\n");
printf("\t\t| 3.查看队头 |\n");
printf("\t\t| 4.数据入栈 |\n");
printf("\t\t| 5.数据出栈 |\n");
printf("\t\t| 6.查看栈顶 |\n");
printf("\t\t| 7.打印栈 |\n");
printf("\t\t| 8.打印队列 |\n");
printf("\t\t| 9.逆置队列 |\n");
printf("\t\t| 10.退出系统 |\n");
printf("\t\t|-------------------------------------------------------------|\n");
printf("\n\t\t请输入您的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
EnQueue(&Q);
break;
case 2:
DelQueue(&Q);
break;
case 3:
GetHead(Q);
break;
case 4:
Push(&S);
break;
case 5:
Pop(&S);
break;
case 6:
GetTop(&S);
case 7:
PrintStack(&S);
break;
case 8:
PrintQueue(Q);
break;
case 9:
ReQueue(&Q,&ReS);
break;
case 10:
printf("退出成功");
break;
default:
printf("选择有误,请重新选择");
break;
}
} while (input != 10);
}