很有想法的一个问题---用栈实现队列和用队列实现栈

本文介绍如何使用栈实现队列的先进先出特性,以及如何利用队列实现栈的后进先出特性。通过两个栈或队列的配合,可以模拟出对方的数据结构行为,实现数据结构的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.栈实现队列:

 思路是有两个栈,一个用来放数据(数据栈),一个用来辅助(辅助栈)。数据添加时,会依次压人栈,取数据时肯定会取栈顶元素,但我们想模拟队列的先进先出,所以就得取栈底元素,那么辅助栈就派上用场了,把数据栈的元素依次弹出到辅助栈,但保留最后一个元素,最后数据栈就剩下了最后一个元素,直接把元素返回,这时数据栈已经没有了数据。最后呢,把辅助栈的元素依次压人数据栈,这样,我们成功取到了栈底元素。

代码如下:

package com.sxt.test.java;
 
public class Stack2Queue {
    /**
     * 用栈的入栈和出栈
     * 来实现队列的入队和出队
     *  stack1是入栈的,stack2是出栈的。
        入队列:直接压入stack1即可
        出队列:如果stack2不为空,把stack2中的栈顶元素直接弹出;
            否则,把stack1的所有元素全部弹出压入stack2中,再弹出stack2的栈顶元素
     * */
    Stack stack1 = new Stack();
    Stack stack2 = new Stack();
    public void add(Object o) {
        stack1.push(o);
    }
    
    public Object poll() {
        Object o = null;
        
        if(stack2.length()==0) {
            //把stack1的数据放入stack2,留下最后一个数据
            while(stack1.length()>1) {
                stack2.push(stack1.pop());
            }
            if(stack1.length()==1) {
                //把stack1的留下的那个数据返回出去
                o = stack1.pop();
            }
        }else {
            o = stack2.pop();
        }
        
        return o;
    }
    public int length() {
        return stack1.length()+stack2.length();
    }
 
}
 

2.队列实现栈
思路同上:有数据队列和辅助队列,模拟栈的先进后出,队列是队尾进队头出,也就是说每次取值要取队列的队尾元素,数据队列出队到辅助队列,留下最后一个元素返回,辅助队列再把元素出队到数据队列

代码如下:

 

package com.sxt.test.java;
 
public class Queue2Stack {
    /**
     * 用队列的入队和出队
     * 来实现栈的入栈和出栈
     * */
    
    Queue queue1 = new Queue();//主要存放数据
    Queue queue2 = new Queue();//辅助
    
    public void push(Object o) {
        queue1.add(o);
    }
    
    public Object pop() {
        Object o = null;
        while(queue1.length()>1) {
            queue2.add(queue1.poll());
        }
        if(queue1.length()==1) {
            o = queue1.poll();
            while(queue2.length()>0) {
                queue1.add(queue2.poll());
            }
        }
        
        return o;
    }
    
    public int length() {
        return queue1.length();
    }
    
 
}
 

在C语言中,将顺序(通常用数组或动态内存分配实现)、链使用链表)队列(通常使用数组或链接节点)的操作合并到同一个文件中,你需要定义各自的数据结构并提供相应的操作接口。这里我会给出一个简化的例子: ```c #include <stdio.h> #include <stdlib.h> // 顺序结构体 typedef struct StackArray { int capacity; int top; int* data; } StackArray; // 链结构体 typedef struct StackLink { struct Node* top; struct Node { int value; struct Node* next; } *node; } StackLink; // 队列结构体 typedef struct Queue { int front; int rear; int capacity; int* data; } Queue; // 顺序操作 (push, pop, peek) void push(StackArray* stack, int value); int pop(StackArray* stack); int peek(StackArray* stack); // 链操作 (push, pop, peek) void push_link(StackLink* stack, int value); int pop_link(StackLink* stack); int peek_link(StackLink* stack); // 队列操作 (enqueue, dequeue, is_empty) void enqueue(Queue* queue, int value); int dequeue(Queue* queue); bool is_empty(Queue* queue); // 初始化/销毁数据结构 StackArray* create_stack(int size); void destroy_stack(StackArray* stack); StackLink* create_link_stack(); void destroy_link_stack(StackLink* stack); Queue* create_queue(int size); void destroy_queue(Queue* queue); // 示例函数调用 int main() { // 创建并使用各数据结构... return 0; } // 接下来的代码分别定义这些操作辅助函数 ``` 在这个例子中,每个数据结构都有自己的初始化(create_...)、销毁(destroy_...)以及基本操作(push, pop, peek, enqueue, dequeue)。为了保持简洁,我没有包含完整的源码细节,但主要的想法是为每种数据结构创建对应的结构体,然后为它们提供单独的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值