Java基础篇:一个堆栈类

本文介绍了一个Java实现的堆栈类Stack,通过封装数组实现先进后出的数据存储。堆栈通过压栈(push)和出栈(pop)操作进行控制,文章还提供了测试类TestStack的示例,展示如何使用Stack类并验证其功能。

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

尽管Box类在说明一个类的必要的元素时是有用的,但它实际应用的价值并不大。为了显示出类的真实的功能,本章将用一个更复杂的例子来说明类的强大功能。

在Java中,就是通过类这样的机制来完成封装性。在创建一个类时,你正在创建一种新的数据类型,不但要定义数据的属性,也要定义操作数据的代码。进一步,方法定义了对该类数据相一致的控制接口。

因此,你可以通过类的方法来使用类,而没有必要担心它的实现细节或在类的内部数据实际上是如何被管理的。

在某种意义上,一个类像“一台数据引擎”。你可以通过操纵杆来控制使用引擎,而不需要知道引擎内是如何工作的。事实上,既然细节被隐蔽,当需要时,它的内部工作可以被改变。只要你的代码通过类的方法来使用它,内部的细节可以改变而不会对类的外部带来负面影响。

为了看看前面讨论概念的一个实际的应用,让我们开发一个封装的典型例子:堆栈(stack)。堆栈用先进后出的顺序存储数据。堆栈通过两个传统的操作来控制:压栈(push)和出栈(pop)。在堆栈的上面加入一项,用压栈,从堆栈中取出一项,用出栈。你将看到,将整个堆栈机制封装是很容易的。

下面是一个叫做Stack的类,实现整数的堆栈。

// This class defines an integer stack that can hold 10 values. 
class Stack { 
 int stck[] = new int[10]; 
 int tos; 
 // Initialize top-of-stack 
 Stack() { 
tos = -1; 
 } 
 // Push an item onto the stack 
 void push(int item) { 
if(tos==9) 
 System.out.println("Stack is full."); 
else 
 stck[++tos] = item; 
 } 
 // Pop an item from the stack 
 int pop() { 
if(tos < 0) { 
 System.out.println("Stack underflow."); 
 return 0; 
}
else 
 return stck[tos--]; 
 } 
}

正如你看到的,Stack类定义了两个数据项、三个方法。整数堆栈由数组stck存储。该数组的下标由变量tos控制,该变量总是包含堆栈顶层的下标。

Stack()构造函数将tos初始化为-1,它指向一个空堆栈。方法push()将一个项目压入堆栈。为了重新取回压入堆栈的项目,调用pop()。

既然存取数据通过push()和pop(),数组中存储堆栈的事实实际上和使用的堆栈不相关。例如,堆栈可以被存储在一个更复杂的数据结构中,例如一个链表,但push()和pop()定义的接口仍然是一样的。

下面示例的类TestStack,验证了Stack类。该类产生两个整数堆栈,将一些值存入,然后将它们取出。

class TestStack { 
 public static void main(String args[]) { 
  Stack mystack1 = new Stack(); 
  Stack mystack2 = new Stack(); 
// push some numbers onto the stack 
  for(int i=0; i<10; i++) mystack1.push(i); 
  for(int i=10; i<20; i++) mystack2.push(i); 
// pop those numbers off the stack 
  System.out.println("Stack in mystack1:"); 
  for(int i=0; i<10; i++) 
  System.out.println(mystack1.pop()); 
  System.out.println("Stack in mystack2:"); 
  for(int i=0; i<10; i++) 
  System.out.println(mystack2.pop()); 
 } 
}

该程序产生的输出如下:

Stack in mystack1: 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
Stack in mystack2: 
19 
18 
17 
16
15 
14 
13 
12 
11 
10

你已经看到,每个堆栈中的内容是分离的。

关于Stack类的最后一点。正如它现在执行的一样,通过Stack类外面的代码可以改变保存堆栈的数组stck。这样的Stack是开放的,容易误用或损坏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值