栈的数组实现和链式实现

news/2024/7/5 20:47:20


1,堆栈ADT


ContractedBlock.gif ExpandedBlockStart.gif StackADT

   
package Stack;

public interface StackADT {

public void push(Object element); // 压栈

public Object pop(); // 出栈

public boolean isEmpty();

public int size();

public Object peek(); // 返回栈顶对象的一个引用

public String toString();
}



2,链式实现

在栈的一段添加和删除元素,在栈中维护一个指向栈顶的结点和一个count变量指示栈的大小:



  
private LinearNode top; // 指向栈顶
private int count; // 标记栈的大小


每次出栈和压栈在链表的表头:(也可以再表尾,实现方式不一样而已)

top--->元素1--->元素2--->元素3.........


实现(附带测试main):


ContractedBlock.gif ExpandedBlockStart.gif LinkedStack

   
package Stack;

import Bag.LinearNode;

// 为了重点来实现算法,将异常情况直接打印出然后退出程序,不再声明异常类

public class LinkedStack implements StackADT {

private LinearNode top; // 指向栈顶
private int count; // 标记栈的大小

public static void main(String[] args){
LinkedStack stack
= new LinkedStack();

System.out.println(
" 将0到10依次压栈 " );
for ( int i = 0 ;i < 10 ;i ++ )
stack.push(i);
System.out.println(
" 连续执行5次出栈操作 " );
for ( int i = 0 ;i < 5 ;i ++ )
stack.pop();

System.out.println(
" 栈为空吗?: " + stack.isEmpty());
System.out.println(
" 栈的大小为: " + stack.size());
System.out.println(
" 栈顶元素为: " + stack.top.getElement());
System.out.println(
" 栈顶元素为: " + stack.peek());
}

public LinkedStack()
{
top
= null ;
count
= 0 ;
}

public int size() {
return count;
}

public boolean isEmpty() {
return (size() == 0 );
}

public void push(Object element) {
LinearNode node
= new LinearNode(element);
node.setNext(top);
top
= node;
count
++ ;
}

public Object pop() {
if (isEmpty())
{
System.out.println(
" stack is empty! " );
System.exit(
1 );
}
Object result
= top.getElement();
top
= top.getNext();
count
-- ;

return result;
}

public Object peek() {

Object result
= top.getElement();
return result;
}

}



运行结果:

将0到10依次压栈
连续执行5次出栈操作
栈为空吗?: false
栈的大小为: 5
栈顶元素为: 4
栈顶元素为: 4






3,数组实现


栈底总是数组下标为0的位置,入栈出栈从数组下标的最后一个元素开始:



  
private Object[] contents;
private int top; // top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!


实现(附带测试main):


ContractedBlock.gif ExpandedBlockStart.gif ArrayStack

   
package Stack;

public class ArrayStack implements StackADT {

private Object[] contents;
private int top; // top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!

private static int SIZE = 10 ;


public ArrayStack()
{
contents
= new Object[SIZE];
top
= 0 ;
}

public void expand(){ // 借助于申请一个辅助空间,每次扩展容量一倍
Object[] larger = new Object[size() * 2 ];
for ( int index = 0 ;index < top;index ++ )
larger[index]
= contents[index];

contents
= larger;
}

public int size() {
return top;
}

public boolean isEmpty() {
return (size() == 0 );
}

public void push(Object element) {
// if(isEmpty())
// expand();
if (top == contents.length)
expand();
contents[top]
= element;
top
++ ;
}

public Object pop() {
if (isEmpty())
{
System.out.println(
" stack is empty! " );
System.exit(
1 );
}

Object result
= contents[top - 1 ];
contents[top
- 1 ] = null ; // 出栈
top -- ;

return result;

/* 书上这样写简便一点:::
* top--;
* Object result = contents[top];
* contents[top] = null;
*/
}

public Object peek() {
Object result;
if (isEmpty())
result
= null ;
else
result
= contents[top - 1 ];
return result;
}

public static void main(String[] args) {
ArrayStack stack
= new ArrayStack();
System.out.println(
" 将0到24依次压栈,然后连续10次出栈 " );
for ( int i = 0 ;i < 25 ;i ++ )
stack.push(i);
for ( int i = 0 ;i < 10 ;i ++ )
stack.pop();
System.out.println(
" 栈的大小为: " + stack.size());
System.out.println(
" 栈为空吗?: " + stack.isEmpty());
System.out.println(
" 栈顶元素为: " + stack.peek());
}


}


运行结果:

将0到24依次压栈,然后连续10次出栈
栈的大小为: 15
栈为空吗?: false
栈顶元素为: 14






http://www.niftyadmin.cn/n/4644359.html

相关文章

Python 使用pyinstaller打包后,print打印颜色乱码

问题描述&#xff1a; Python 使用pyinstaller打包后&#xff0c;print打印颜色乱码&#xff0c;如图&#xff1a; 代码如下&#xff0c;直接运行是正常的&#xff0c;使用pyinstaller打包后运行乱码 class bcolors:OKRED \033[1;31mEND \033[0mprint(bcolors.OKRED红色字体…

javascript面向对象-组合使用构造函数和原型模式时在原型对象添加init函数

JavaScript面向对象的写法中为什么喜欢在原型对象添加init函数&#xff0c;在函数里添加对象属性&#xff0c;然后构造函数再apply() 为什么不直接把属性添加进构造函数里&#xff0c;而要apply原型的init函数&#xff0c;让我们一起来探讨这个问题 按照你的描述&#xff0c;…

windows下如何同时使用多个不同版本的python

1、首先下载多个版本的安装包&#xff0c;比如python3.8和python3.6; 2、安装好添加环境变量&#xff0c;重启电脑&#xff1b; 3、本人常用python3.8&#xff0c;所以把python3.6重命名为python1,对应的pip为重命名为pip1,这样使用python3.6的时候&#xff0c;只需执行如下命令…

学计算机的你伤不起啊!!!!!!

学计算机的你伤不起啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 老子六年前开始学计算机啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 于是提上了尼玛不归路啊&#xff01;&#xff01;&#xff01;&#xff01;&#…

python报错:dll loaded failed where importing _socket:参数错误

问题描述&#xff1a; python程序在win10环境下使用pyinstaller打包后&#xff0c;在windowsServer2008R2下运行报错&#xff08;python编译版本为python3.8&#xff09;&#xff1a; “dll loaded failed where importing _socket:参数错误”; 解决办法&#xff1a; 查了一些…

SoupUi报错“Transport level information does not match with SOAP Message namespace”

问题描述&#xff1a; SoupUi发送报文时报错“Transport level information does not match with SOAP Message namespace”。 问题原因&#xff1a; SoapUi的版本和命名空间不一致。 SoapUi1.1版本&#xff1a; http://schemas.xmlsoap.org/soap/envelope/ SoapUi1.2版本&…

Spring MVC 类型转换器和转换器工厂

Spring MVC 框架的 Converter<S&#xff0c;T> 是一个可以将一种数据类型转换成另一种数据类型的接口&#xff0c;这里 S 表示源类型&#xff0c;T 表示目标类型。开发者在实际应用中使用框架内置的类型转换器基本上就够了&#xff0c;但有时需要编写具有特定功能的类型转…

PLSQL/Oracle解决中文乱码问题

问题描述&#xff1a; PLSQL/Oracle中文乱码&#xff1b; 问题原因&#xff1a; PLSQL客户端编码和服务器端编码不一致&#xff0c;插入中文时就会出现乱码&#xff1b; 解决办法&#xff1a; 1、查看服务器端编码&#xff1a; select userenv(language) from dual;2、查看PLS…