Java实现一个简单的栈结构---Strack

栈是数据结构的一种,其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

之前我觉得栈是一个非常难于理解的数据结构,其实不然,很多的时候真的是自己对于定义不清不楚,遇到想不通的问题便放弃了,对于实现一个简单的栈结构,我们首先要明白采用什么顺序表结构作为底层的实现,笔者这里采用的是基于数组的栈结构。实现一个栈,我们要从定义入手:

(1)仅允许在表的一端进行插入和删除,这意味着我们需要一个指针变量,用来代表这一端。

(2)我们采用的是基于数据的栈,那么我还还需要定义一个数组来包裹我们的数据对象

(3)栈的初始大小,最大值等等

清楚了上面的步骤,我觉得就可以自己思考怎么去实现了,下面我们通过代码来看看:

 

public class Stack<E> {
	
	private int max_size = 16;//栈容量(最大值)
	
	private int top = -1;//栈顶指针
	
	private Object[] data;//栈数据
	
	private double opcatity = 0.75;//负载因子
	
	public Stack(){
		this(10);
	}
	public Stack(int size){
		if(size<0){
			throw new IllegalArgumentException("栈的初始大小不能小于0"+size);
		}
		if(size>max_size){
			max_size = max_size + (int)(max_size*opcatity);
		}
		max_size = size;
		data = new Object[max_size];
	}
	public E push(E e){
		if(top>this.max_size-1){
			throw new RuntimeException("栈已满");
		}
		E obj = e;
		data[++top] = e;
		return obj;
	}
	public E pop(){
		if(top==-1){
			throw new RuntimeException("栈为空");
		}
		return (E) data[top--];
	}
	public E search(int index){
		if(index>this.max_size-1||index<0){
			throw new RuntimeException("查找不在范围之内");
		}
		int i = 0;
		while(index!=i){
			i++;
		}
		return (E) data[i];
	}
}

然后我们来测试一下:

 

public class Main {
	public static void main(String[] args) {
		Stack stack = new Stack(10);
		
		 for(int i=0;i<10;i++)  
	        {  
			 	stack.push(i);  
	        }  
		 for(int i=0;i<10;i++){
			 System.out.println(stack.pop());
		 }
	        
	}
}

 

 

 

结果:

 

 

9
8
7
6
5
4
3
2
1
0
就这样就实现了一个简单的栈,是不是很简单,其实关键在于理解好定义。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是用链表实现的代码: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 struct Node { int data; struct Node *next; }; // 压函数 void push(struct Node **head, int data) { // 创建新节点 struct Node *new_node = (struct Node*) malloc(sizeof(struct Node)); new_node->data = data; new_node->next = NULL; // 如果堆为空,则将新节点作为堆头节点 if (*head == NULL) { *head = new_node; printf("Push 1st Data:%d\n", data); return; } // 否则将新节点插入到堆头部 new_node->next = *head; *head = new_node; printf("Push %dth Data:%d\n", (*head)->data, data); } // 出函数 void pop(struct Node **head) { // 如果堆为空,则直接返回 if (*head == NULL) { return; } // 否则弹出堆顶部节点 struct Node *temp = *head; printf("Pop %dth Data:%d\n", (*head)->data, temp->data); *head = (*head)->next; free(temp); } int main() { struct Node *head = NULL; // 压入5个数据 for (int i = 1; i <= 5; i++) { int data; printf("请输入要压的整数:"); scanf("%d", &data); push(&head, data); } // 弹出5个数据 for (int i = 1; i <= 5; i++) { pop(&head); } return 0; } ``` 在上面的代码中,我们使用了链表来实现数据结构。在 `push` 函数中,我们首先创建一个新节点,并将它插入到链表头部,同时打印出“Push”语句以及数据的编号和值。在 `pop` 函数中,我们首先判断链表是否为空,如果不为空,则弹出链表头部节点,并释放该节点所占的内存,同时打印出“Pop”语句以及数据的编号和值。最后在主函数中,我们先压入5个数据,然后再弹出这5个数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值