java_实现栈以及测试类

栈的设计与实现及应用

一、目的和要求:

1)正确定义栈(顺序栈或链栈);

2)掌握栈基本操作实现方法;

3)能正确分析算法的时间复杂度;

3)采用栈解决实际问题。

二、实验原理及内容:

1)定义栈(顺序栈或链栈);

2)栈基本操作实现方法;

3)采用栈解决实际问题(数制转换)。

三、实验步骤:(以顺序栈为例实现,也可以自行采用链栈实现)

1)定义顺序栈;

2)顺序栈基本操作实现方法;

3)采用栈解决数制转换问题。

四、实验过程

1、工程结构如下图所示:

 

2、栈接口定义:IStack.java

public interface IStack<E> {
      E push(E item); //入栈
      E pop(); //出栈
      E peek(); //取栈顶元素
      int size();//返回栈中元素的个数
      boolean empty();//判断栈是否为空
      void clear();  //清空栈
}


3、顺序栈定义及基本操作实现: SeqStack.java

import java.lang.reflect.Array;
import java.lang.reflect.Array;
public class SeqStack<E> implements IStack<E> {
    private int maxsize; // 顺序栈的容量
    private E[]data; // 数组,用于存储顺序栈中的数据元素
    private int top; // 指示顺序栈的栈顶
    // 初始化栈
    @SuppressWarnings("unchecked")
    public SeqStack(Class<E> type,int size) {
       data = (E[]) Array.newInstance(type, size);
       this.maxsize = size;
       top = 0;
    }
    // 入栈操作
    public E push(E item) {
       if (isFull()) {
           data[top] = item;
           top++;
           return item;
       } else
           return null;
    }
    // 出栈操作
    public E pop() {
       if (!empty()) {
           E temp = data[top - 1];
           top--;
           return temp;
       } else {
           return null;
       }
    }
    // 获取栈顶数据元素
    public E peek() {
       if (!empty()) {
           E temp = data[top - 1];
           return temp;
       } else {
           return null;
       }
    }
    // 求栈的长度
    public int size() {
       returntop;
    }
    // 判断顺序栈是否为空
    public boolean empty() {
       if (this.top == 0)
           return true;
       return false;
    }
    // 判断顺序栈是否为满
    public boolean isFull() {
       if (this.maxsize ==top)
           return false;
       return true;
    }
    // 清空栈
    public void clear() {
       this.top = 0;
    }
}

4、链栈结点的定义:StackNode.java

public class StackNode<E> {
    private Edata; // 数据域
    private StackNode<E>next; // 引用域
     //构造函数
    public StackNode(){
      
    }
    public StackNode(E data) {
       this.data = data;
    }
    public StackNode(E data, StackNode<E> next) {
       super();
       this.data = data;
       this.next = next;
    }
    //数据域get属性
    public E getData() {
       return data;
    }
    //数据域set属性
    public void setData(E data) {
       this.data = data;
    }
    //引用域get属性
    public StackNode<E> getNext() {
       return next;
    }
    //引用域get属性
    public void setNext(StackNode<E> next) {
       this.next = next;
    }
}

5、链栈定义及基本操作实现:LinkStack.java

public class LinkStack<E> implements IStack<E> {
    private StackNode<E>top; // 栈顶指示器
    private int size; // 栈中结点的个数
 
    public StackNode<E> getTop() {
       returntop;
    }
 
    public void setTop(StackNode<E> top) {
       this.top = top;
    }
 
    public int getSize() {
       returnsize;
    }
 
    public void setSize(int size) {
       this.size = size;
    }
 
    // 初始化链栈
    public LinkStack() {
       top =null;
       size = 0;
    }
 
    // 入栈操作
    public E push(E item) {
       StackNode<E> i = new StackNode<E>(item);
       i.setNext(top);
       top = i;
       size++;
       return item;
    }
 
    // 出栈操作
    public E pop() {
       E i = null;
       if (!empty()) {
           i = top.getData();
           top =top.getNext();
           size--;
       }
       return i;
    }
 
    // 获取栈顶数据元素
    public E peek() {
       if (!empty())
           returntop.getData();
       return null;
    }
 
    // 求栈的长度
    public int size() {
       returnsize;
    }
 
    // 判断顺序栈是否为空
    public boolean empty() {
       if (top ==null)
           return true;
       return false;
    }
    // 清空栈
    public void clear() {
       top =null;
    }
}


6、栈的测试

public class TestStack {
    public static void main(String[] args) {
       int[] data={23,45,3,7,6,945};
       //IStack<Integer> stack=new SeqStack<Integer>(Integer.class,data.length);
       IStack<Integer> stack=new LinkStack<Integer>();
       //入栈操作
       System.out.println("*******入栈操作*******");
        for(int i=0; i<data.length;i++){
            stack.push(data[i]);
             System.out.println(data[i]+"入栈"); 
            } 
        int size=stack.size();
       //出栈操作
        System.out.println("*******出栈操作*******"); 
        for(int i=1; i<size;i++){ 
            System.out.println(stack.pop()+"出栈 "); 
        } 
    }
}

7、使用栈解决进制转换问题

import java.util.Scanner;
/**
 * 键盘输十进制数,输出转成的其它进制结果
 * 先输入用例个数n
 * 接下来n行,每行两个数,分别表示要转换的数及对应的进制(只能转成十六进制以内的进制)
 * @author Administrator
 */
public class Numberconvert {
    public static void main(String[] args) {
       Character  ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
       Scanner sc = new Scanner(System.in);
       int n; //用例数
       int m; //想转换的数
       int k; //想转换成的目标进制
       int t;
       IStack<Character> stack = new SeqStack<Character>(Character.class,100);
       //IStack<Character> stack=new LinkStack<Character>();
       n = sc.nextInt();
       for(int i=0;i<n;i++){
           m = sc.nextInt();
           k = sc.nextInt();
           if(m==0) System.out.println(0);
           else
           {
              stack.clear();
              //请在此补充代码,实现余数入栈
                while(m>0)
                {
                  stack.push(ch[m%k]);
                  m = m/k;
                }
              while(!stack.empty()){
                  System.out.print(stack.pop());
              }
              System.out.println();
           }
       }
    }
}

转载于:https://www.cnblogs.com/new-zjw/p/8540918.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值