利用栈逆置队列(c语言)

由于编者时间以及水平有限,如有错误,敬请斧正 ʘᴗʘ

本文是我发布过的文章部分,主界面在这::顺序栈和队列的操作以及栈逆置队列(C语言)

利用栈先进后出的规则,可以对队列逆置

#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,int x)///元素入队操作
{
    if ((Q->rear + 1) % MAXSIZE == Q->front)
    {
        printf("队列满了\n");
        return;
    }
    Q->base[Q->rear] = x;
    Q->rear = (Q->rear + 1) % MAXSIZE;
}

void DelQueue(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)//入栈
{
    if (S->top == MAXSIZE-1)
    {
        printf("栈满了");
        return;
    }
    S->top++;
    S->base[S->top] = x;
}

void Pop(SqStack* S,int *e)/出栈
{
    if (S->top == -1)
    {
        printf("栈空了");
        return;
    }
    *e=S->base[S->top];
    S->top--;
}



void ReQueue(SqQueue *Q,SqStack *S)/逆置栈的函数
{
    int e;
    while(Q->front!=Q->rear)
    {
        DelQueue(Q,&e);///元素通过e出队,随后e被栈接收,e作为中间值暂存元素
        Push(S,e);
    }
    while(S->top!=-1)
    {
        Pop(S,&e);//元素e出栈,随后e被队列接收,由于栈先进后出的原则,原先的队列就被逆置了
        EnQueue(Q,e);
    }
}

int main()
{
    SqQueue Q;
    InitQueue(&Q);
    SqStack S;
    InitStack(&S);
    int num,i,x,e;
    printf("输入队列个数");
    scanf("%d",&num);
    for(i=0; i<num; i++)
    {
        printf("输入入队元素");
        scanf("%d",&x);
        EnQueue(&Q,x);
    }
    printf("开始逆置\n");
    ReQueue(&Q,&S);
    printf("逆置后的队列:");
    PrintQueue(Q);

}

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值