import java.util.LinkedList;
import java.util.Stack;
/**
* 1、利用两个栈实现一个队列 思路:插入的时候直接插入第一个栈 移除的时候,如果第二个栈为空,则把第一个站所有元素放入第二个站 从第二个站移除一个元素即可
* 2、两个队列实现一个栈 思路:插入的时候,如果两个队列都为空则插入任意一个队列,否则插入非空的那个队列
* 移除的时候,把非空队列的元素全部弄到空队列里,把最后一个元素返回
* 3、利用一个队列实现一个栈 思路:利用递归的方式把队列反转,返回第一个
* 4、利用一个栈实现一个队列 思路: 利用递归的方式把数据都推出来,返回最后一个
* 5、实现栈取和进最小数都是O(1)
* 思路:在插入数据的时候同时把当前最小的数也插入到栈中,从而在取的时候就娶到最小数, 同时在取的时候把该数和最小数都一起弹出
*
* @author wangjianfu
*
*/
public class TestStack1 {
public static void main(String[] args) {
MiniStack q = new MiniStack(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
q.push(15);
q.push(10);
q.push(5);
q.push(25);
q.push(20);
System.out.println("当前最小值:" + q.getMinNumber());
System.out.println("拿出值:" + q.pop());
System.out.println("当前最小值:" + q.getMinNumber());
System.out.println("拿出值:" + q.pop());
System.out.println("当前最小值:" + q.getMinNumber());
System.out.println("拿出值:" + q.pop());
System.out.println("当前最小值:" + q.getMinNumber());
System.out.println("拿出值:" + q.pop());
}
}
class MiniStack {
private Integer minnumber = 10000;
private int top = -1;
private Integer[] numbers;
private int length = 0;
private int maxlen;
public MiniStack(int length) {
numbers = new Integer[length];
maxlen = length/2;
}
// 插入数据
public void push(int n) {
if (length + 2 > maxlen - 1) {
System.out.println("栈 已经满了");
return;
}
minnumber = n > minnumber ? minnumber : n;
top++;
numbers[top] = n;
top++;
length++;
numbers[top] = minnumber;
}
public Integer pop() {
if (length == 0) {
System.out.println("栈为空");
return null;
}
top--;// 跳过最小的数
int result = numbers[top];
top--;
length--;
return result;
}
public Integer getMinNumber() {
if (length == 0) {
System.out.println("栈为空");
return null;
}
return numbers[top];
}
}
class Queue {
private Stack<Integer> s1 = new Stack<Integer>();
private Stack<Integer> s2 = new Stack<Integer>();
public void insert(Integer temp) {
s1.push(temp);
}
public Integer remove() {
if (s2.size() == 0) {
// 把s1元素全部弹出放入s2
while (s1.size() > 0) {
s2.push(s1.pop());
}
}
// 从s2中直接弹出一个元素
return s2.pop();
}
}
class Queue2 {
private Stack<Integer> s1 = new Stack<Integer>();
public void insert(Integer temp) {
s1.push(temp);
}
public Integer remove() {
if (s1.size() == 0) {
return null;
}
if (s1.size() == 1) {
return s1.pop();
}
int temp = s1.pop();
int result = remove();
s1.push(temp);
return result;
}
}
class Stackk {
private java.util.LinkedList<Integer> q1 = new LinkedList<Integer>();
private java.util.LinkedList<Integer> q2 = new LinkedList<Integer>();
public void insert(Integer temp) {
if (q1.size() == 0 && q2.size() == 0) {
q1.add(temp);
} else if (q1.size() > 0) {
q1.add(temp);
} else {
q2.add(temp);
}
}
public Integer remove() {
if (q1.size() > 0) {
while (q1.size() > 0) {
q2.add(q1.poll());
}
return q2.poll();
} else if (q2.size() > 0) {
while (q2.size() > 0) {
q1.add(q2.poll());
}
return q1.poll();
} else {
return null;
}
}
}
class Stackk2 {
private java.util.LinkedList<Integer> q2 = new LinkedList<Integer>();
public void insert(Integer temp) {
q2.add(temp);
}
public Integer remove() {
if (q2.size() == 0) {
return null;
}
reverse();
int result = q2.poll();
reverse();
return result;
}
public void reverse() {
if (q2.size() == 0) {
return;
}
int temp = q2.poll();
reverse();
q2.add(temp);
}
}
分享到:
相关推荐
队列是先进先出,有队头和队尾,因此用第一个栈的栈顶表示队头,第二个表示队尾。 2. 队列插入的时候是从尾巴插入,因此代表尾部的栈可以定义成一个插入栈也是队尾栈。 3. 队列输出遵守先进先出原则,输出的元素是队...
在计算机科学中,数制转换是一项基础且重要的概念,它涉及到不同数值系统之间的相互转化。本文将详细探讨如何利用栈这种数据结构来实现二进制、八进制和十六进制之间的转换。栈是一种具有“后进先出”(LIFO)特性的...
5. **字符与数字的相互转换**:在C语言中,我们需要将数字转换为字符(例如,将十进制数字2转换为字符'2'),以便在输出时显示正确的进制数字。同样,我们也可能需要将字符转换回数字来进行计算。 6. **内存管理**...
### C语言顺序栈实现十进制到二进制、八进制、十六进制的转换 #### 一、概述 本篇文章将详细介绍如何使用C语言中的顺序栈来实现十进制数字向二进制、八进制以及十六进制的转换。通过分析给出的代码示例,我们将...
在计算机科学领域,数制转换是一项基础而重要的技术,它涉及到不同进制数字之间的相互转换。其中,二进制、八进制、十进制和十六进制是最常见的数制,它们广泛应用于计算机系统的设计与操作中。在《用C语言中栈实现...
在计算机科学中,数值转换是一项基础且至关重要的任务,它涉及到不同进制系统之间的相互转换。进制系统是表示数字的规则,最常见的有二进制(Base-2)、八进制(Base-8)、十进制(Base-10)和十六进制(Base-16)。...
栈和队列的应用实现 进制间的相互转换 C++
栈的应用举例之一是十进制数到八进制数的转换。这个问题可以使用栈来解决,将十进制数逐步除以8,并将余数压入栈中,然后将栈中的元素依次弹出,形成八进制数。 栈是一种重要的数据结构,它的插入和删除操作只能在...
"C语言用栈实现十进制转换为二进制的方法示例" 本文主要介绍了C语言用栈实现十进制转换为二进制的方法,结合实例形式分析了C语言栈的定义及进制转换使用技巧。 一、栈的定义 在C语言中,栈是一种特殊的数据结构,...
另一种通用的转化方式是通过中序遍历,将树的中序遍历序列转换为二叉树。在转化过程中,每个节点的左子树对应于中序遍历序列中的更小元素,右子树对应于更大元素。这种方法要求树是有序的,例如,二叉搜索树。 ...
为了实现这一转换,我们需要在某些时刻将一个栈中的元素全部弹出并压入另一个栈中,以确保出队操作能正确地从队列的前端(即栈底)取出元素。 下面是如何使用两个栈来模拟队列的详细步骤: 1. **初始化**:创建两...
CFG(上下文无关语法,Context-Free Grammar)与PDA(推导栈自动机,Pushdown Automaton)是理论计算机科学中的重要概念,主要用于形式语言的研究。这篇代码是使用VC++编程语言实现的,目的是实现CFG到PDA的转换。...
在计算机科学中,数据结构是组织和...了解和掌握这些基本数据结构及其相互转换的方法,对于提升编程能力和解决问题的能力大有裨益。在实际编程中,灵活运用不同的数据结构,能帮助我们更好地设计高效、优雅的解决方案。
### 数据结构课程设计知识点详解:栈和数组在数制转换中的应用 #### 一、引言 ##### 1、设计题目的目的 本课程设计旨在加深学生对C语言及数据结构的理解,通过实际编程项目训练学生的编程技能,尤其是对数据结构...
在iOS开发中,数据处理是不可或缺的一部分,而字典与模型之间的转换经常涉及到对象的序列化和反序列化。MJExtension就是这样一个专为iOS设计的轻量级框架,它极大地简化了字典到模型(Dictionary to Model)以及模型...
TCP/IP协议栈是互联网通信的基础,它定义了网络设备如何互相通信的一套标准。这个协议栈分为四个主要层次,每个层次都有其特定的功能,确保数据能够准确无误地在网络中传输。 首先,我们来了解OSI七层参考模型。这...
### 使用两个栈实现队列功能 ...这种实现方式的关键在于利用栈的 LIFO 特性,通过两个栈之间的相互转换,来达到队列 FIFO 的效果。虽然这种方法可能会导致较高的空间复杂度,但在某些场景下不失为一种有效的解决方案。
自JDK 5.0起,引入了自动装箱和拆箱机制,使得基本类型和其包装类之间可以互相转换,如`Integer i = 3;`。这背后实际上是编译器自动进行了`Integer i = new Integer(3);`的转换。 关于`String str = "abc"`的工作...
【路由器双协议栈设计与实现】 随着网络技术的飞速发展,传统的IPv4协议已经无法满足日益增长的网络需求,IPv6作为一种更先进、地址空间更大的协议,逐渐成为网络发展的趋势。在这种背景下,设计并实现支持IPv4和...
本文介绍了一种基于GPRS(通用分组无线服务)无线通信技术的嵌入式TCP/IP协议栈的设计与实现。该研究侧重于在PC(个人计算机)平台上实现PPP协议中的LCP(链路控制协议)、PAP(密码认证协议)、IPCP(互联网控制...