package org.jf.alg;
/**
* * 算法描述:
一个栈stack,具有push和pop操作,其时间复杂度皆为O(1)。
设计算法max操作,求栈中的最大值,该操作的时间复杂度也要求为O(1)。
可以修改栈的存储方式,push,pop的操作,但是要保证O(1)的时间复杂度,空间时间复杂度无要求。
链表存储, 当然数组存储也可以
* @author junfeng.chen
*
*/
public class Pstack<T extends Comparable> {
private Node head;
private int size ;
public void push(T data)
{
Node node = new Node();
node.data = data;
if(head==null)
{
head = node;
head.max = data;
}else
{
if(head.max.compareTo(data)>0)
node.max = head.max;
else
node.max = data;
node.next = head;
head = node;
}
size++;
}
public T pop()
{
if(head==null)
throw new RuntimeException("Stack is empty");
T data = head.data;
if(size==1)
head = null;
else
head = head.next;
size --;
return data;
}
public boolean isEmpty()
{
return size==0;
}
public int size()
{
return size;
}
public T peek()
{
if(size==0)
return null;
return head.data;
}
public T peekMax()
{
if(size == 0)
return null;
return head.max;
}
class Node
{
T data;
T max;
Node next;
}
}
分享到:
相关推荐
函数可以包含多个`return`语句,通过逻辑判断来决定哪个`return`语句会被执行,如示例中的最大值函数`max(int a, int b)`,通过`if`语句控制返回`a`或`b`。 六、参数传递方式 在C语言中,函数参数有两种主要的传递...
`IsEmpty`函数用于检查栈是否为空,如果`top`大于`Max - 1`,则栈非空,反之为空。 `GetTopEle`函数返回栈顶元素。如果栈为空,返回`NULL`;否则,返回`ele[top]`。 `Pop`函数删除栈顶元素,如果栈为空,输出提示...
实验内容包括创建一个包含若干元素的顺序栈,并对栈执行基本操作,如入栈(Push)、出栈(Pop)、判断栈是否为空(StackEmpty)以及获取栈顶元素(GetTop)。代码中定义了一个名为`STACK`的结构体,包含一个字符数组...
C语言中的函数是程序设计的重要组成部分,它们可以封装一段具有特定功能的代码,方便重复使用和模块化编程。本篇内容主要围绕C语言中的函数展开,包括函数的分类、定义、调用、传值调用、地址传送调用、嵌套调用以及...
有参函数如`max(int a, int b)`接收两个整数参数并返回较大的那个。 函数参数的选取原则是只把对函数功能至关重要的变量作为参数,其他辅助变量应在函数内部定义。参数列表反映了函数的输入和输出,而函数体则描述...
存储类包括自动(栈上的变量)、静态(生命周期跨越函数调用)、外部(全局变量)和内部链接(在同一源文件中可见的全局变量)。 4.8 预编译预处理 预编译预处理在实际编译之前进行,处理像`#include`、`#define`等...
这里定义了一个`SeqStack`类型,包含两个成员:`data`数组用于存储栈中的元素,`top`变量记录栈顶的位置。 ##### 2. 初始化栈 ```c SeqStack* Init() { SeqStack* s; s = (SeqStack*)malloc(sizeof(SeqStack)); ...
`{}`内的部分是函数体,包含实现函数功能的代码。`return`语句用于返回函数的结果。 **函数调用** 函数调用有以下两种形式: 1. 直接调用:`函数名(参数列表);`,如`max(3, 5);` 2. 赋值调用:`变量 = 函数名(参数...
第7章"函数"是C语言程序设计的重要部分,涵盖了以下几个核心知识点: 1. **函数的概念与定义**: - C程序是由一个主函数(main函数)和若干子函数组成的,程序执行从主函数开始。 - 函数提供模块化编程,使得代码...
栈的操作函数包括初始化栈(InitStack)、判断栈是否为空(StackEmpty)、入栈(Push)、出栈(Pop)以及遍历栈(StackTraverse)。 在`conversion()`函数中,实际实现了数制转换的过程。通过循环询问用户是否进行...
在本章"第七章 用函数实现模块化程序设计1"中,我们将深入探讨如何使用C语言中的函数来实现程序的模块化设计。模块化设计是软件开发中的一个关键概念,它有助于提高代码的可读性、可维护性和重用性。 首先,我们来...
栈的基本操作主要包括压入(Push)、弹出(Pop)、查看栈顶元素(Peek)和检查栈是否为空(IsEmpty)。栈在计算机系统中有着广泛的应用,例如在函数调用、表达式求值、深度优先搜索(DFS)等领域。 1. 压入操作...
栈是一种非常基础且重要的数据结构,被广泛应用于各种算法和程序设计中。本文将深入探讨栈的原理,以及如何用C语言实现一个栈。 栈被称为“后进先出”(Last In, First Out,简称LIFO)的数据结构,它的主要操作...
这两个文件可能包含了生成随机元素的函数,用于测试顺序栈。`RandomElementFactory.c`可能包含一个生成随机整数的函数,用于`Push`操作,而`RandomElementFactory.h`可能声明了这个函数。 总结,顺序栈是一种重要...
首先,函数是程序设计中的基本单元,它封装了一段具有特定功能的代码。在C++中,每一个程序至少包含一个`main()`函数,这是程序执行的起点。除了内置的库函数,如字符处理、字符串处理和数学计算等,开发者还可以...
首先,栈的基本操作包括压栈(Push)、弹栈(Pop)和查看栈顶元素(Peek)。在实现排列组合的过程中,我们通常会用到压栈和弹栈操作。一个数字排列组合的过程可以理解为从一个数字集合中选择若干个数字并确定它们的...
实验中定义了一个名为`DStack`的结构体,包含一个存储元素的数组`data`和两个指针`top1`和`top2`,分别表示两个栈的栈顶位置。数组的两端分别作为两个栈的底端,中间区域用于存储元素。栈一的栈顶在数组低端,栈二的...