1.栈
栈也叫堆栈,是一种限制只能在某一端进行插入和删除操作的线性表
栈的 顺序存储结构下的进栈操作:
栈的链式存储结构如下
2.java代码实现栈的顺序存储
首先栈是顺序存储的,所以底层用WxArrList实现,WxArrList是我自己实现的线性表的顺序存储结构,还实现了线性表的链式存储结构,这里我用WxArrList实现栈的操作
老规矩,先来一个栈的基本操作的接口:
package com.wx.base;
public interface WxStack {
/*
这是一个栈操作的接口
*/
public void push(Object e); //压入元素进栈
public Object pop(); //弹出栈顶的值
public Object peek(); //查询栈顶的值
public boolean isEmpty(); //判断栈是否为空
public int size(); //返回栈的大小
}
实现栈的操作接口:
package com.wx.imp;
import com.wx.base.WxStack;
import java.util.EmptyStackException;
public class WxStackImp implements WxStack {
private WxArrList stackList=null;
public WxStackImp()
{
stackList=new WxArrList();
}
//压入元素进栈
@Override
public void push(Object e) {
stackList.add(e);
}
//弹出栈顶的元素并删除栈顶的元素
@Override
public Object pop() {
Object o = stackList.get(size() - 1);
stackList.remove(o);
return o;
}
//查询栈顶的值
@Override
public Object peek() {
if (stackList.size()==0)
{
throw new EmptyStackException();
}
return stackList.get(size()-1);
}
//判断栈是否为空
@Override
public boolean isEmpty() {
return stackList.isEmpty();
}
//返回栈的大小
@Override
public int size() {
return stackList.size();
}
}
测试:判断符号是否平衡的一个案例:
将字符串转换为字符字符数组。历遍判断,如果读到左边的符号就压入栈,如果读到右边的符号就判断此时栈是否为空,如果为空,则此符号肯定不平衡返回false,如果部位空则从栈中弹出栈顶元素(弹出后会在栈中删除此元素),弹出的元素与该右边符号对应的左边符号对比,如果不相等返回false.如果当栈中元素全部弹出还没有返回false,那么栈该符号平衡,返回true.
package com.wx.test;
import com.wx.imp.WxStackImp;
public class TestStack {
public static void main(String[] agrs)
{
String s="{()}";
TestStack testStack=new TestStack();
boolean pingheng = testStack.isPingheng(s);
System.out.print(pingheng);
}
public boolean isPingheng(String s)
{
WxStackImp wxStack=new WxStackImp();
char[] chars = s.toCharArray();
for (int i=0;i<chars.length;i++)
{
if(chars[i]=='{')
{
wxStack.push(chars[i]);
}else if (chars[i]=='}')
{
if (wxStack.isEmpty())
{
return false;
}else {
char pop = (Character)wxStack.pop();
if (pop!='{')
{
return false;
}
}
}
if(chars[i]=='(')
{
wxStack.push(chars[i]);
}else if (chars[i]==')')
{
if (wxStack.isEmpty())
{
return false;
}
else
{
char pop = (Character)wxStack.pop();
if (pop!='(')
{
return false;
}
}
}
}
//当所有的字符都匹配成功弹出来了以后,栈就空了
if (wxStack.isEmpty())
{
return true;
}
return false;
}
}
运行结果:
栈的链式存储读者可以仿照顺序储存,用我的线性表的链式存储来实现
扫描二维码关注公众号,回复:
4068238 查看本文章
本案例代码地址:https://github.com/WangAlainDelon/DataStructure3.git