通过两个队列实现一个栈(C语言)

stackBy2Queue.h文件

#pragma once

#define max_size 1000

typedef char DataType;

typedef struct Queue
{
    DataType data[max_size];
    int head;
    int tail;
    //队列中有效元素个数
    int size;
}Queue;

typedef struct Stack
{
    Queue queue1;
    Queue queue2;
    //栈中有效元素个数
    int size;
}Stack;
//初始化函数
void StackInit(Stack *stack);
//销毁函数
void StackDestroy(Stack *stack);
//入栈操作函数
void StackPush(Stack *stack,DataType value);
//出栈操作函数
void StackPop(Stack *stack);
//取栈顶元素函数
int StackGetTop(Stack *stack,DataType *value);

stackBy2Queue.c文件

#include<stdio.h>
#include"stackBy2Queue.h"

#define Test_Header printf("\n==========%s==========\n",__FUNCTION__);

//队列初始化函数
void QueueInit(Queue *queue)
{
    if(queue == NULL)
    {
        //非法输入
        return;
    }
    queue->head = 0;
    queue->tail = 0;
    queue->size = 0;
}
//队列销毁函数
void QueueDestroy(Queue *queue)
{
    if(queue == NULL)
    {
        //非法输入
        return;
    }
    queue->head = 0;
    queue->tail = 0;
    queue->size = 0;
}
//入队列操作函数
void QueuePush(Queue *queue,DataType value)
{
    if(queue == NULL)
    {
        //非法输入
        return;
    }
    if(queue->size >= max_size)
    {
        //队列满了
        return;
    }
    queue->data[queue->tail++] = value;
    queue->size++;
    if(queue->tail > max_size)
    {
        //如果tail走到了队列的尾部
        queue->tail = 0;
    }
}
//出队列操作函数
void QueuePop(Queue *queue)
{
    if(queue == NULL)
    {
        //非法输入
        return;
    }
    if(queue->size == 0)
    {
        //空队列
        return;
    }
    if(queue->head >= max_size)
    {
        //如果head走到了队列的最后一个元素
        //呢出队列以后继续回到队列一开始的地方
        //就相当于是将最后一个元素出对队列
        queue->head = 
  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用一个队列实现一个,具体思路如下: 1. 定义一个队列结构体,包含一个数组和两个指针 front 和 rear,分别指向队列的头和尾。 2. 定义一个结构体,包含一个队列的指针和一个整数 top,表示顶元素的下标。 3. 入操作时,将元素插入队列的尾部,同时更新 top 的值。 4. 出操作时,将队列的 rear 指针指向的元素弹出,同时更新 top 的值。 5. 判断是否为空时,判断 top 的值是否为 -1。 下面是示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 定义队列结构体 typedef struct { int data[MAXSIZE]; int front; // 队首指针 int rear; // 队尾指针 } Queue; // 初始化队列 void initQueue(Queue *q) { q->front = q->rear = -1; } // 判断队列是否为空 int isEmpty(Queue *q) { return q->front == -1; } // 判断队列是否已满 int isFull(Queue *q) { return (q->rear + 1) % MAXSIZE == q->front; } // 入队操作 void enqueue(Queue *q, int x) { if (isFull(q)) { printf("Queue is full.\n"); return; } if (isEmpty(q)) { q->front = q->rear = 0; } else { q->rear = (q->rear + 1) % MAXSIZE; } q->data[q->rear] = x; } // 出队操作 int dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); return -1; } int x = q->data[q->front]; if (q->front == q->rear) { q->front = q->rear = -1; } else { q->front = (q->front + 1) % MAXSIZE; } return x; } // 定义结构体 typedef struct { Queue *q; int top; // 顶指针 } Stack; // 初始化 void initStack(Stack *s) { s->q = (Queue *) malloc(sizeof(Queue)); initQueue(s->q); s->top = -1; } // 判断是否为空 int stackIsEmpty(Stack *s) { return s->top == -1; } // 入操作 void push(Stack *s, int x) { enqueue(s->q, x); s->top++; } // 出操作 int pop(Stack *s) { if (stackIsEmpty(s)) { printf("Stack is empty.\n"); return -1; } int i, x; // 将队列中的前 top 个元素出队再入队,实现的弹出操作 for (i = 0; i < s->top; i++) { x = dequeue(s->q); enqueue(s->q, x); } // 弹出顶元素 x = dequeue(s->q); // top 减 1 s->top--; return x; } int main() { Stack s; initStack(&s); push(&s, 1); push(&s, 2); push(&s, 3); printf("%d\n", pop(&s)); // 3 printf("%d\n", pop(&s)); // 2 printf("%d\n", pop(&s)); // 1 printf("%d\n", pop(&s)); // Stack is empty. return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值