栈的基础

1.栈的基础概念

a.栈是限制在表的一端进行插入(进栈)和删除(出栈)运算的线性表,而进行这两个操作,需要一个头指针。
b.通常称插入,删除的这一端为栈顶,另一端为栈底。
c.当表中没有元素时称为空栈。假设栈S=(a1,a2,...an),a1称为栈底元素,an称为栈顶元素。

注意:栈是按后进先出的原则进行的,所以,栈称为后进先出(先进后出)表。

2.栈的实现——顺序栈

栈抽象数据结构 栈接口, 描述栈抽象数据类型,泛型参数T表示数据元素的数据类型:

package com.clarck.datastructure.stack;

/**
* 栈抽象数据结构 栈接口, 描述栈抽象数据类型,泛型参数T表示数据元素的数据类型

* @author clarck

* @param <T>
*/
public interface SStack<T> {
/**
* 判断栈是否为空

* @return
*/
boolean isEmpty();

/**
* 元素x入栈

* @param x
*/
void push(T x);

/**
* 出栈,返回栈顶元素

* @return
*/
T pop();

/**
* 取栈顶元素, 未出栈

* @return
*/
T get();
}



顺序栈:

package com.clarck.datastructure.stack;

/**
* 顺序栈

* @author clarck

* @param <T>
*/
public class SeqStack<T> implements SStack<T> {
/**
* 存储栈数据元素的数组
*/
private Object element[];

/**
* 栈顶元素下标
*/
private int top;

/**
* 构造容量为size的空栈
*/
public SeqStack(int size) {
this.element = new Object[Math.abs(size)];
this.top = -1;
}

/**
* 构造默认容量的空栈
*/
public SeqStack() {
this(64);
}

/**
* 判断栈是否空,若空返回true
*/
@Override
public boolean isEmpty() {
return this.top == -1;
}

/**
* 元素x入栈,空对象不能入栈
*/
@Override
public void push(T x) {
if (x == null)
return;

// 若栈满,则扩充栈容量
if (this.top == element.length - 1) {
Object[] temp = this.element;
// 重新申请一个容量更大的数组
this.element = new Object[temp.length * 2];
// 复制数组元素,O(n)
for (int i = 0; i < temp.length; i++) {
this.element[i] = temp[i];
}
}
this.top++;
this.element[this.top] = x;
}

/**
* 出栈,返回栈顶元素,若栈空返回null
*/
@SuppressWarnings("unchecked")
@Override
public T pop() {
return this.top == -1 ? null : (T) this.element[this.top--];
}

/**
* 取栈顶元素,未出栈,若栈空返回null
*/
@SuppressWarnings("unchecked")
@Override
public T get() {
return this.top == -1 ? null : (T) this.element[this.top];
}

/**
* 返回栈所有元素的描述字符串,形式为“(,)”,算法同顺序表
*/
@Override
public String toString() {
String str = "(";
if (this.top != -1)
str += this.element[this.top].toString();
for (int i = this.top - 1; i >= 0; i--) {
str += ", " + this.element[i].toString();
}
return str + ") ";
}

}



顺序栈的测试类:

package com.clarck.datastructure.stack;

/**
* 栈的测试类

* @author clarck

*/
public class Stack_test {
public static void main(String args[]) {
SeqStack<String> stack = new SeqStack<String>(20);
System.out.print("Push: ");
char ch = ‘a‘;
for (int i = 0; i < 5; i++) {
String str = (char) (ch + i) + "";
stack.push(str);
System.out.print(str + " ");
}
System.out.println(stack.toString());
}

}

测试结果如下:

Push: a b c d e (e, d, c, b, a) 

提醒:源码下载链接为:

http://www.cnblogs.com/tanlon/p/4039667.html

3.栈的实现——链式栈

栈抽象数据结构 栈接口, 描述栈抽象数据类型,泛型参数T表示数据元素的数据类型:

package com.clarck.datastructure.stack;

/**
* 栈抽象数据结构 栈接口, 描述栈抽象数据类型,泛型参数T表示数据元素的数据类型

* @author clarck

* @param <T>
*/
public interface SStack<T> {
/**
* 判断栈是否为空

* @return
*/
boolean isEmpty();

/**
* 元素x入栈

* @param x
*/
void push(T x);

/**
* 出栈,返回栈顶元素

* @return
*/
T pop();

/**
* 取栈顶元素, 未出栈

* @return
*/
T get();
}



栈结点类,T指定结点的元素类型:

package com.clarck.datastructure.stack;

/**
* 单链表结点类,T指定结点的元素类型

* @author clarck
*
* @param <T>
*/
public class Node<T> {
/**
* 数据域,保存数据元素
*/
public T data;

/**
* 地址域,引用后继结点
*/
public Node<T> next;

/**
* 构造结点,data指定数据元素,next指定后继结点

* @param data
* @param next
*/
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}

/**
* 构造节点
*/
public Node() {
this(null, null);
}

/**
* 返回结点元素值对应的字符串
*/
@Override
public String toString() {
return this.data.toString();
}

/**
* 比较两个结点值是否相等,覆盖Object类的equals(obj)方法
*/
@SuppressWarnings("unchecked")
@Override
public boolean equals(Object obj) {
return obj == this || obj instanceof Node && this.data.equals(((Node<T>)obj).data);
}

}

 


链式栈:

package com.clarck.datastructure.stack;

/**
* 链式栈

* @author clarck

* @param <T>
*/
public class LinkedStack<T> implements SStack<T> {
/**
* 栈顶结点
*/
private Node<T> top;

/**
* 构造空栈
*/
public LinkedStack() {
this.top = null;
}

/**
* 判断栈是否空,若空返回true
*/
@Override
public boolean isEmpty() {
return this.top == null;
}

/**
* 元素x入栈,空对象不能入栈
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void push(T x) {
//头插入,x结点作为新的栈顶结点
if (x != null) {
this.top = new Node(x, this.top);
}
}

/**
* 出栈,返回栈顶元素,若栈空返回null
*/
@Override
public T pop() {
if (this.top == null)
return null;
//取栈顶结点元素
T temp = this.top.data;
//删除栈顶结点
this.top = this.top.next;
return temp;
}

/**
* 取栈顶元素,未出栈,若栈空返回null
*/
@Override
public T get() {
return this.top == null ? null : this.top.data;
}

/**
* 返回栈所有元素的描述字符串,形式为“(,)”。算法同不带头结点的单链表
*/
@Override
public String toString() {
String str = "(";
for (Node<T> p = this.top; p != null; p = p.next) {
str += p.data.toString();
//不是最后一个结点时后加分隔符
if (p.next != null) {
str += ", ";
}
}
return str + ") ";
}

}



栈的测试类:

package com.clarck.datastructure.stack;

/**
* 栈的测试类

* @author clarck

*/
public class Stack_test {
public static void main(String args[]) {
LinkedStack<Integer> stack2 = new LinkedStack<Integer>();
System.out.print("Push: ");
for (int i = 1; i <= 5; i++) {
Integer intobj = new Integer(i);
stack2.push(intobj);
System.out.print(intobj + " ");
}

System.out.println("\n Stack: " + stack2.toString());
System.out.print("Pop: ");
while (!stack2.isEmpty()) { // 全部出栈
System.out.print(stack2.pop().toString() + " ");
}
System.out.println();
}

}



测试结果:

Push: 1 2 3 4 5 
Stack: (5, 4, 3, 2, 1) 
Pop: 5 4 3 2 1

提醒:源码下载地址为:

http://www.cnblogs.com/tanlon/p/4039677.html

时间: 2024-10-04 10:22:01

栈的基础的相关文章

栈的基础操作——2,8,16进制的入栈——数组类型定义

#define stack_init_size 100 #define stackincrement 10 typedef int ElemType; typedef int status; const status error=0; const status ok=1; const status overflow=-2; const int MAXSIZE = 100; typedef struct { ElemType elem[MAXSIZE]; int top; } SqStack; s

Stack栈的基础实现

1 public class Stack { 2 private final int INIT_SIZE = 10; 3 private int size = 0; 4 private int[] array; 5 6 public Stack() { 7 array = new int[INIT_SIZE]; 8 } 9 10 public Stack(int init) { 11 if (init <= 10) { 12 init = 10; 13 } 14 array = new int[

python 全栈 python基础 (十六)面向对象编程的 继承 多态与多态性 封装

一.继承顺序: 多继承情况下,有两种方式:深度优先和广度优先 1.py3/py2 新式类的继承:在查找属性时遵循:广度优先 继承顺序是多条分支,按照从左往右的顺序,进行一步一步查找,一个分支走完会走另一个分支(若多条分支汇总一个头,除最后一条分支能走到头,其他的都走到次之位置停止,进行下一条分支的查找),直到查找到头为止. 可以利用 类名.__mro__ 的方法查看类之间的继承关系(经典类没有这种方法) 1 class B(object): 2 def func(self): 3 print('

python 全栈 web基础(五)Jquery

jQuery是一个快速的,简洁的javaScript库(占空间特别小,但功能强大!兼容性极强!),这个库里封装了一些方法,使用户能更方便地处理HTMLdocuments.events.实现动画效果,并且方便地为网站提供AJAX交互. 一.jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuery 里的方法. jquery的基础语法:$(selector).a

linux 命令之 pushd、popd、dirs,以及栈的基础知识

栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表 插入.删除这些操作的一端为栈顶(Top),另一端称为栈底(Bottom). 当表中没有元素时称为空栈. 栈为一种先进后出的数据结构.或者称为后进先出 栈的修改需要遵循先进后出的原则.每次删除(退栈)的总是当前栈中"最新"元素(最后入栈的元素),而最先插入的元素是被放在栈的底部,要最后才能删除. 如图所示,元素是以 a1,a2,-,a(n-1),an的顺序入栈,退栈的顺序则是 an,a(n-1),-,a2,a1 pu

React技术栈系列—基础01

React简介 于2013年来自Facebook开源项目. 和Angular不一样的是,React并不是一个完整的MVC/MVVM框架,它只专注于提供清晰.直接的View视图层解决方案.它的功能全部以构建组件视图为核心,并提供类似控制器的函数接口和生命周期函数.所以在React中么有控制器.没有服务.没有指令.没有过滤器等等这些. Virtual DOM 是React中的一个非常重要的概念,在日常开发中,前端需要将后端的数据呈现到界面中,同事还要能对用户的操作提供反馈,并且作用到UI上,这些操作

HDU 1702 ACboy needs your help again!(栈 队列 基础)

#include<cstdio> #include<cmath> #include<queue> #include<stack> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int t,n; int main() { int i,j,k; cin>>t; char op[10],io[10]; whi

python 全栈 python基础 (十三)匿名函数 与 内置函数

一.匿名函数  1.定义: 匿名函数顾名思义就是指:是指一类无需定义标识符(函数名)的函数或子程序. 2.语法格式:lambda 参数:表达式 lambda语句中,开头先写关键字lambda,冒号前是参数,可以有多个,用逗号隔开:冒号右边的为表达式,需要注意的是只能有一个表达式.由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收.  3.注意点:lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值.lambda 函数不能包含命令,包含

python 全栈 linux基础 (部分)正则表达式 grep sed

/etc/profile /etc/bashrc  .变量添加到shell环境中,永久生效. /root/.bashrc /root/.bash_profile 正则表达式 定义:正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.(被命令所解释) 三种文本处理工具/命令:grep sed awk grep(过滤) 参数 -n  :显示行号 -o  :只显示匹配的内容 -q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 -l