算法实例练习记录——括号匹配是否完整问题 [链表实现栈 + 栈的应用](JAVA实现)

 括号匹配是否完整问题 [链表实现栈 + 栈的应用]

本篇博文涉及两个内容:

  1. 单向链表实现——栈的功能

  2. 的特点实现——括号匹配(或者叫字符匹配)


第一个问题:单向链表实现——栈的功能(后进先出)

为了实现栈的后进先出功能,选择链表的头节点(head)比较好操作,入栈和出栈操作如下:

  • 入栈---push(item):在链表头部head节点处,完成入栈。
  • 出栈---pop():在链表头部head节点处,完成出栈,并返回出栈节点的item的值。

下面是具体实现,功能包括——判控、长度计算、入栈、出栈,不包括遍历。

//链表实现栈的操作
//栈的特点——后进先出
//结合单向链表和栈的特点,入栈push()和出栈pop()操作,只能在链表的一端完成,这里我们选择都在链表的表头完成即可。
//isEmpty()判断栈是否为空
//size()计算栈的长度
public class ItemStack {

	private Node head;
	private int N;
	
	ItemStack(){
		this.head=new Node();
		this.N=0;
	}
	
	private class Node{
		char item;
		Node next;
	}
	
	//判断栈空
	public boolean isEmpty() {
		return head==null;
	}
	
	//返回链表节点数量
	public int size() {
		return N;
	}
	
	//入栈操作,添加在链表头部
	public void push(char item) {
		Node node=new Node();
		node.item=item;
		node.next=head;
		head=node;
		
		N++;
	}
	
	//出栈操作,从表头删除节点
	public char pop() {
		
		char item=head.item;
		head=head.next;
		
		N--;
		return item;
	}

}

第二个问题:用栈的特点实现——括号匹配(或者叫字符匹配) 

用上面我们创建好的——ItemStack,来实现匹配问题。

问题比较简单,直接上代码:


public class ParenthesesItemStack {

	//利用java的泛型,创建一个存储char的栈--->strstack
		private ItemStack strstack;
		
		//构造函数,对strstack栈进行初始化。
		ParenthesesItemStack(){
			this.strstack=new ItemStack();
		}
		
		//判断函数parentheses(str),对str字符串是否符合规则,进行判断,并返回boolean值。
		public boolean parentheses(String str) {
			
			boolean flag=false;
			char c;
			
			//如果传入的字符串为空串,直接返回false。
			if(str.length()==0) {
				return false;
			}
			
			//判断功能的核心代码
			for(int i=0; i<str.length(); i++) {
				//逐个获取字符串str中的字符
				c=str.charAt(i);
				
				//用switch多分枝选择结构实现规则判定
				switch(c) {
					//字符c都为左括弧时,做入栈操作。
					case '(':
					case '[':
					case '{':
						strstack.push(c);
						break;
					
					//字符c为右括弧时,做出栈操作,分情况判断,三种情况--->),],},看出栈字符和c是否匹配。
					case ')':
						if(!strstack.isEmpty()) flag=strstack.pop()=='('?true:false;
						else flag=false;
						break;
						
					case ']':
						if(!strstack.isEmpty()) flag=strstack.pop()=='['?true:false;
						else flag=false;
						break;
						
					case '}':
						if(!strstack.isEmpty()) flag=strstack.pop()=='{'?true:false;
						else flag=false;
						break;
					
					//字符c,不是括号时,直接返回false。	
					default:
						return false;
						
				}
			}
			
			//字符串循环结束后,判断栈是否为空,为空-->即说明匹配成功。
			if(strstack.isEmpty()) {
				flag=true;
			}else flag=false;
		
			return flag;
		}
		
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			Parentheses p=new Parentheses();
			
			System.out.print(p.parentheses("[]{{{()[]}}}"));
		}
	


}

  下面的代码是直接用JDK自带的栈Stack容器类来实现的,仅供参考——其实都一样的。


 简单说就是对 [栈——后进先出] 的相关知识的理解和运用。

import java.util.Stack;

/*
 * 对于给定的一个由括号组成的字符串,判定其中的括号是否配对完整。
 * 例如,对于 [()]{}{[()()]()} 程序应该打印 true,对于 [(]) 则打印 false。
 * 
 */

//核心思想就是用栈satck的后进先出原则,来实现这个功能。
//程序比较简单,这里就不再赘述了,直接上代码。

public class Parentheses {

	//利用java的泛型,创建一个存储char的栈--->strstack
	private Stack<Character> strstack;
	
	//构造函数,对strstack栈进行初始化。
	Parentheses(){
		this.strstack=new Stack<Character>();
	}
	
	//判断函数parentheses(str),对str字符串是否符合规则,进行判断,并返回boolean值。
	public boolean parentheses(String str) {
		
		boolean flag=false;
		char c;
		
		//如果传入的字符串为空串,直接返回false。
		if(str.length()==0) {
			return false;
		}
		
		//判断功能的核心代码
		for(int i=0; i<str.length(); i++) {
			//逐个获取字符串str中的字符
			c=str.charAt(i);
			
			//用switch多分枝选择结构实现规则判定
			switch(c) {
				//字符c都为左括弧时,做入栈操作。
				case '(':
				case '[':
				case '{':
					strstack.push(c);
					break;
				
				//字符c为右括弧时,做出栈操作,分情况判断,三种情况--->),],},看出栈字符和c是否匹配。
				case ')':
					if(!strstack.isEmpty()) flag=strstack.pop()=='('?true:false;
					else flag=false;
					break;
					
				case ']':
					if(!strstack.isEmpty()) flag=strstack.pop()=='['?true:false;
					else flag=false;
					break;
					
				case '}':
					if(!strstack.isEmpty()) flag=strstack.pop()=='{'?true:false;
					else flag=false;
					break;
				
				//字符c,不是括号时,直接返回false。	
				default:
					return false;
					
			}
		}
		
		//字符串循环结束后,判断栈是否为空,为空-->即说明匹配成功。
		if(strstack.isEmpty()) {
			flag=true;
		}else flag=false;
	
		return flag;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Parentheses p=new Parentheses();
		
		System.out.print(p.parentheses("[]{{()[]}}"));
	}

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值