`
cjf068
  • 浏览: 34423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计包含max函数的栈

 
阅读更多
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`函数删除栈顶元素,如果栈为空,输出提示...

    数据结构顺序栈验证实验报告.pdf

    实验内容包括创建一个包含若干元素的顺序栈,并对栈执行基本操作,如入栈(Push)、出栈(Pop)、判断栈是否为空(StackEmpty)以及获取栈顶元素(GetTop)。代码中定义了一个名为`STACK`的结构体,包含一个字符数组...

    c语言程序设计王勇第7章函数.ppt

    C语言中的函数是程序设计的重要组成部分,它们可以封装一段具有特定功能的代码,方便重复使用和模块化编程。本篇内容主要围绕C语言中的函数展开,包括函数的分类、定义、调用、传值调用、地址传送调用、嵌套调用以及...

    C 程序设计课件:第三章 函数.ppt

    有参函数如`max(int a, int b)`接收两个整数参数并返回较大的那个。 函数参数的选取原则是只把对函数功能至关重要的变量作为参数,其他辅助变量应在函数内部定义。参数列表反映了函数的输入和输出,而函数体则描述...

    C++程序设计:第4章 函数与预编译预处理.pptx

    存储类包括自动(栈上的变量)、静态(生命周期跨越函数调用)、外部(全局变量)和内部链接(在同一源文件中可见的全局变量)。 4.8 预编译预处理 预编译预处理在实际编译之前进行,处理像`#include`、`#define`等...

    C语言-顺序栈实现十进制转换为二进制-八进制-十六进制

    这里定义了一个`SeqStack`类型,包含两个成员:`data`数组用于存储栈中的元素,`top`变量记录栈顶的位置。 ##### 2. 初始化栈 ```c SeqStack* Init() { SeqStack* s; s = (SeqStack*)malloc(sizeof(SeqStack)); ...

    c语言程序设计王勇第7章函数2.ppt

    `{}`内的部分是函数体,包含实现函数功能的代码。`return`语句用于返回函数的结果。 **函数调用** 函数调用有以下两种形式: 1. 直接调用:`函数名(参数列表);`,如`max(3, 5);` 2. 赋值调用:`变量 = 函数名(参数...

    C语言程序设计教学课件:第7章 函数.ppt

    第7章"函数"是C语言程序设计的重要部分,涵盖了以下几个核心知识点: 1. **函数的概念与定义**: - C程序是由一个主函数(main函数)和若干子函数组成的,程序执行从主函数开始。 - 函数提供模块化编程,使得代码...

    栈的应用----数制转换(C/C++)

    栈的操作函数包括初始化栈(InitStack)、判断栈是否为空(StackEmpty)、入栈(Push)、出栈(Pop)以及遍历栈(StackTraverse)。 在`conversion()`函数中,实际实现了数制转换的过程。通过循环询问用户是否进行...

    第七章 用函数实现模块化程序设计1

    在本章"第七章 用函数实现模块化程序设计1"中,我们将深入探讨如何使用C语言中的函数来实现程序的模块化设计。模块化设计是软件开发中的一个关键概念,它有助于提高代码的可读性、可维护性和重用性。 首先,我们来...

    数据结构——栈(代码)

    栈的基本操作主要包括压入(Push)、弹出(Pop)、查看栈顶元素(Peek)和检查栈是否为空(IsEmpty)。栈在计算机系统中有着广泛的应用,例如在函数调用、表达式求值、深度优先搜索(DFS)等领域。 1. 压入操作...

    数据结构之栈(C实现)

    栈是一种非常基础且重要的数据结构,被广泛应用于各种算法和程序设计中。本文将深入探讨栈的原理,以及如何用C语言实现一个栈。 栈被称为“后进先出”(Last In, First Out,简称LIFO)的数据结构,它的主要操作...

    顺序栈ADT数据结构代码

    这两个文件可能包含了生成随机元素的函数,用于测试顺序栈。`RandomElementFactory.c`可能包含一个生成随机整数的函数,用于`Push`操作,而`RandomElementFactory.h`可能声明了这个函数。 总结,顺序栈是一种重要...

    ch06 过程封装--函数.ppt

    首先,函数是程序设计中的基本单元,它封装了一段具有特定功能的代码。在C++中,每一个程序至少包含一个`main()`函数,这是程序执行的起点。除了内置的库函数,如字符处理、字符串处理和数学计算等,开发者还可以...

    利用栈实现数的排列组合

    首先,栈的基本操作包括压栈(Push)、弹栈(Pop)和查看栈顶元素(Peek)。在实现排列组合的过程中,我们通常会用到压栈和弹栈操作。一个数字排列组合的过程可以理解为从一个数字集合中选择若干个数字并确定它们的...

    数据结构实验报告-栈及其应用

    实验中定义了一个名为`DStack`的结构体,包含一个存储元素的数组`data`和两个指针`top1`和`top2`,分别表示两个栈的栈顶位置。数组的两端分别作为两个栈的底端,中间区域用于存储元素。栈一的栈顶在数组低端,栈二的...

Global site tag (gtag.js) - Google Analytics