风落平川 2023-12-01 12:44 采纳率: 96.7%
浏览 8
已结题

C语言两个栈模拟一个队列

两个栈模拟一个队列,主函数中应输出第一个入队的元素,实际上输出的是第二个,即数字2.问题出在哪里?如何纠正?


#include <stdio.h>
#include <stdlib.h>
typedef struct Stack
{
    int* Data;
    int size;//有效元素个数
    int capacity;//栈的容量
}Stack;

typedef struct Queue
{
    Stack input;
    Stack output;
    //有效元素个数
    int size;
}Queue;

void StackInit(Stack* stack,int capacity)//栈初始化
{
    if (stack)
    {
      stack->capacity = capacity;
      stack->size = 0;
      stack->Data = (int*)malloc(sizeof(int)* stack->capacity);
    }

}
int StackEmpty(Stack* stack)//判栈空
{
    if (stack->size == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int StackGetTop(Stack* stack)//取栈顶元素
{
    if (stack == NULL)
    {
        return -1;
    }
    if (stack->size == 0)
    {
        return 0; 
    }
    else
    {
        return stack->Data[stack->size];
    }
}
int StackPush(Stack* stack,int value)//入栈
{
    if (stack == NULL)
    {
        return 0;
    }
    else
    {
        stack->Data[stack->size] = value;
        stack->size++;
        return 1;
    }
}
int StackPop(Stack* stack)//出栈
{
    if (stack == NULL)
    {
        return -1;
    }
    if(stack->size == 0)
    {
        return 0;
    }
    else
    {
      stack->size--;
      return stack->Data[stack->size];
    }

}




void QueueInit(Queue* queue,int capacity)//队列初始化
{
    if (queue)
    {
       StackInit(&queue->input,capacity);
       StackInit(&queue->output, capacity);
       queue->size = 0;
    }
}
void QueuePush(Queue *queue, int value)//入队
{
    if (queue)
    {
        StackPush(&queue->input, value);
        queue->size++;
    }
    
}
//取队首元素函数
int QueueFront(Queue* queue)
{
    if (queue == NULL)
    {
        return -1;
    }
    if (StackEmpty(&queue->output))
    {
        if (StackEmpty(&queue->input))
        {
            return 0;
        }
        else
        {
            int newsize = queue->input.size;
            for (int i = 0; i <newsize ; ++i)
            {
                int tmp = StackGetTop(&queue->input);
                StackPop(&queue->input);
                StackPush(&queue->output, tmp);
            }
        }
    }
    return StackGetTop(&queue->output);
}
int QueuePop(Queue* queue)//出队
{
    if (queue == NULL)
    {
        return -1;
    }
    if (StackEmpty(&queue->output))
    {
        if (StackEmpty(&queue->input))
        {
            return 0;
        }
        else
        {
            int newsize = queue->input.size;
            for(int i = 0;i< newsize;++i)
            {
                int tmp = StackGetTop(&queue->input);
                StackPop(&queue->input);
                StackPush(&queue->output,tmp);
            }
        }
    }
    StackPop(&queue->output);
    queue->size--;
    return 1;
}
int main()
{
    Queue queue;
    QueueInit(&queue,10);
    //入队列函数测试
    QueuePush(&queue, 1);
    QueuePush(&queue, 2);
    QueuePush(&queue, 3);
    QueuePush(&queue, 4);
    QueuePop(&queue);
    int a = QueueFront(&queue);
    printf("%d \n", a);
    system("pause");
    return 0;
}
  • 写回答

10条回答 默认 最新

  • 呈两面包夹芝士 2023-12-01 15:36
    关注

    引自讯飞星火
    问题出在QueueInit函数中,初始化队列时,应该先初始化输入栈和输出栈。修改后的QueueInit函数如下:

    void QueueInit(Queue* queue,int capacity)//队列初始化
    {
        if (queue)
        {
           StackInit(&queue->input,capacity);
           StackInit(&queue->output, capacity);
           queue->size = 0;
        }
    }
    

    这样,在主函数中调用QueuePushQueuePop函数时,就可以正确地将元素入队和出队了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 已采纳回答 12月4日
  • 创建了问题 12月1日

悬赏问题

  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题