数据结构JAVA版之栈和队列

一、涉及的内容大纲

二、简单介绍栈、队列和其他数据结构的不同

1 对于其他的数据结构而言,都适用与数据库应用中作数据记录。但是因为栈和队列的生命周期比那些数据库类型的数据结构要短,所以他们只是在程序的操作期间才会创建和执行,在完成任务之后就会被销毁。所以栈和队列更多的是用于构思算法的辅助工具。

2   栈和队列的访问是受限制的,因为在这些结构接口设计时就增强了这种受限访问。

3   栈的主要机制可以用数组来实现,但也可以利用链表来实现。在优先级队列中,内部的实现可以用数组,也可以用一种特别的树——堆来实现。

 

三、栈

栈的特点:只允许访问最后插入的数据项,移除这个数据项后,才可以访问倒数第二个插入的数据项。简单说就是,先进后出。

栈的基础操作:压栈和弹栈

public class MyStack {
	//设定数组的范围
	private int maxSize;
	//创建数组
	private long[] stackArray;
	//设置栈顶的位置
	private int top;
	
	//带参构造方法,初始化各个参数
	public MyStack(int s) {
		maxSize = s;
		stackArray = new long[maxSize];
		//将栈顶的值设置为-1,为了在压入第一个值时,栈顶正好在下标0
		top = -1;
	}
	
	/**
	 * 压栈
	 * @param j
	 */
	public void push(long j) {
		//先对栈顶的下标值增加,然后赋给数组
		stackArray[++top] = j;
	}
	
	/**
	 * 弹栈
	 * @return
	 */
	public long pop() {
		//先将栈顶的值弹出,再将栈顶的下标减一
		return stackArray[top--];
	}
	
	/**
	 * 返回栈顶的值
	 * @return
	 */
	public long peek() {
		return stackArray[top];
	}
	
	/**
	 * 检查栈是否为空
	 * @return
	 */
	public boolean isEmpty() {
		return (top == -1);
	}
	
	/**
	 * 检查栈是否已经满了
	 * @return
	 */
	public boolean isFull() {
		return (top == maxSize - 1);
	}
}

 

测试类

 

/**
 * MyStack类的测试类
 */
public class StackApp {
	public static void main(String[] args) {
		MyStack ms = new MyStack(10);
		
		ms.push(10);
		ms.push(20);
		ms.push(30);
		ms.push(40);
		ms.push(50);
		
		while(!ms.isEmpty()) {
			System.out.print(ms.pop() + " ");
		}
		
		System.out.println("");
	}
}

/**
 * 运行结果:
 * 		50 40 30 20 10 
 */

从上面的运行结果可以看出,输出的结果很输入的结果顺序相反。

栈的简单运用实例1:单词逆序

主要思想:对单词的输入和输出采用栈的方式,就可以实现逆序

代码如下:

/**
 * 实现对单词的逆序
 */
public class ReverseWords {
	//单词的输入
	private String input;
	//单词逆序后的输出
	private String output;
	
	//带参构造实现数据的输入
	public ReverseWords(String in) {
		input = in;
	}
	
	/**
	 * 单词逆序
	 * @return
	 */
	public String Reverse() {
		//设置栈的大小
		int stackSize = input.length();
		MyStack ms = new MyStack(stackSize);
		//将输入的每一个单词的每个字母压入到栈中
		for (int i = 0; i < stackSize; i++) {
			char ch = input.charAt(i);
			ms.push(ch);
		}
		
		output = "";
		//将每一个字符弹出栈中
		while(!ms.isEmpty()) {
			//long类型转换成char类型需要进行强制转化
			char ch = (char)ms.pop();
			output += ch;
		}
		
		//返回逆序后的单词
		return output;
	}
}

测试类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 单词逆序的测试类
 */
public class ReverseWordsApp {
	public static void main(String[] args) throws IOException {
		String input, output;
		while(true) {
			System.out.println("请输入一个单词:");
			System.out.flush();
			
			input = getString();
			
			if (input.equals("")) {
				break;
			}
			
			ReverseWords rw = new ReverseWords(input);
			output= rw.Reverse();
			System.out.println("逆序后的单词是:" + output);
		}
	}
	
	/**
	 * 实现用户输入的读取
	 * @return
	 * @throws IOException
	 */
	public static String getString() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		return s;
	}
}
/*
 * 运行结果
 * 		请输入一个单词:
				word
		逆序后的单词是:drow
 */

栈的简单运用实例2:分隔符的匹配

分隔符匹配类,代码如下:

/**
 * 分隔符的匹配实现
 */
public class BracketChecker {
	private String input;
	
	public BracketChecker(String in) {
		input = in;
	}
	
	public void check() {
		//设置栈的大小
		int stackSize = input.length();
		MyStack ms = new MyStack(stackSize);
		//对输入的字符串进行字符遍历
		for (int i = 0; i < stackSize; i++) {
			char ch = input.charAt(i);
			switch(ch) {
				case '{':
				case '[':
				case '('://如果是碰到左匹配符,就压入栈中
					ms.push(ch);
					break;
				case '}':
				case ']':
				case ')':	
					if (!ms.isEmpty()) {
						//只有栈中有左匹配符才进入进行匹配
						//将栈顶的字符弹出
						char chx = (char)ms.pop();
						if ((ch == '}' && chx != '{') || 
							(ch == ']' && chx != '[') ||
							(ch == ')' && chx != '(')) {
							//如果现在的右匹配符与弹出的左匹配符不相匹配,报错
							System.out.println("括号匹配错误:" + ch + " 在 " + i);
						}
					}else {
						//说明栈中没有任何匹配符,但有右括号需要匹配
						System.out.println("缺少左括号,右括号匹配错误:" + ch + " 在 " + i);
					}
					break;
				default:
					break;
			}
		}
		if(!ms.isEmpty()) {
			//如果栈中还有匹配符存在,说明左匹配符未完全被弹出,所以缺少右匹配符
			System.out.println("错误:缺少右匹配括号");
		}
	}
}

 

测试类

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 分隔符匹配的测试类
 */
public class BrackerApp {
	public static void main(String[] args) throws IOException {
		String input;
		while(true) {
			System.out.println("请输入带有分割符的字符串:");
			System.out.flush();
			input = getString();
			if (input.equals("")) {
				break;
			}
			
			BracketChecker bc = new BracketChecker(input);
			bc.check();
		}
	}
	
	/**
	 * 实现用户输入的读取
	 * @return
	 * @throws IOException
	 */
	public static String getString() throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = br.readLine();
		return s;
	}
}
/*
 * 运行结果
 * 请输入带有分割符的字符串:
        a{b[c(d)f]ge
        错误:缺少右匹配括号
 */ 

队列

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值