栈和队列的操作,以及利用栈逆置队列(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) {
	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);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值