java分隔符算法_《Java数据结构和算法》栈 分隔符分配

分隔符包括“{“、"["、”(”、“] “、“)“、“}”,每个左分隔符需要右分隔符匹配。同时,在字符串中后出现左分隔符应该比早出现的先匹配。

程序从字符串中不断读取字符,每次读取一个字符。若发现是左分隔符,压入栈中;当读到一个右分隔符,弹出栈的左分割符与其比较,如果不匹配则报错。

栈中没有左分隔符和右分隔符匹配/一直存在着没有被匹配的分隔符,报错。

//栈

package StructureBracket;

public class StackX {

private int maxSize;

private char[] stackArray;

private int top;

//构造器

public StackX(int s){

maxSize = s;

stackArray = new char[maxSize];

top = -1;

}

public void push(char j){

stackArray[++top] = j;

}

public char pop(){

return stackArray[top--];

}

public char peek(){

return stackArray[top];

}

public boolean isEmpty(){

return(top == -1);

}

}

//匹配程序

package StructureBracket;

public class BracketChecker {

private String input;

public BracketChecker(String in){

input = in;

}

public void check(){

int stackSize = input.length();

StackX theStack = new StackX(stackSize);

for(int j=0;j

char ch = input.charAt(j);

switch(ch){

case '{':

case '[':

case '(':

theStack.push(ch);

break;

case '}':

case ']':

case ')':

if(!theStack.isEmpty()){

char chx = theStack.pop();

if((ch=='}')&&(chx!='{')||(ch==']')&&(chx!='[')

||(ch==')')&&(chx!='('))

System.out.println("Error: "+ch+" at "+j);

}else

System.out.println("Error: "+ch+" at "+j);

break;

default:

break;

}//end switch

}//end for

if(!theStack.isEmpty())//若能执行到此步,说明以上只执行了push

System.out.println("Error:missing right delimiter");

}

}

//主程序

package StructureBracket;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.BufferedReader;

public class BracketsApp {

public static void main(String[] args)throws IOException{

String input;

while(true){

System.out.print("Enter string containing delimiters: ");

System.out.flush();

input = getString();

if(input.equals(""))

break;

BracketChecker theChecker = new BracketChecker(input);

theChecker.check();

}

}

private static String getString() throws IOException {

// TODO Auto-generated method stub

InputStreamReader isr = new InputStreamReader(System.in);

BufferedReader br = new BufferedReader(isr);

String s = br.readLine();

return s;

}

}

转换规则:

(1)遇到操作数:直接写至输出out;

(2)左括号(:push入栈;(3):右括号):pop出一项,若此项不是(则写至out,若是(则退出循环;

(3)若读到操作符(+、-、*、/等):栈为空,push推其入栈;栈非空,重复:pop一项,若为(push其入 栈,若同样为操作符,比较其优先级:>栈顶push其入栈,≤栈顶,输出栈顶操作符,<栈顶退出循环;项为(,将读到的操作符push入栈;

(4):以上步骤结束后,若栈非空,弹出写至输出out.

f57393cc8f49eddd6f4f61c339eee154.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值