數據結構與算法11-棧和隊列-分隔符匹配

 分隔符匹配:java

棧一般用於解析某種類型的文本串,一般,文本串是用於計算機語言寫的代碼行,而解析它們的程序就是編譯器。數組

check()調用看StackX2類。指針

主程序中從用戶那裏不間斷讀取問本行,把文本字符串做爲參數建立一個BracketCHecker對象,而後調用這個BracketChecker對象的check()方法。若是出現任何錯誤,check()方法將顯示出來,不然分隔符的語法是正確的。code

check()方法能報告出現不匹配分隔符的位置。對象

棧的效率,數據項入棧和出棧的時間複雜度爲常數O(1),棧操做所耗的時間不依賴於棧中數據項的個數。隊列

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


class StackX2 {
private int maxSize;
private char[] stackArray;
private int top;
	public StackX2(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);
	}
}
class BracketChecker
{
	private String input;
	public BracketChecker(String in)
	{
		input = in;
	}
	public void check()
	{
		int stackSize = input.length();
		StackX2 theStack = new StackX2(stackSize);
		for(int j=0;j<input.length();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;
				}
			}
			if(!theStack.isEmpty())
				System.out.println("error:missing");
		}
	}
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;
	}
}
enter string containing delimiters: 
enter string containing delimiters: f{fklkfla(ff[d]}
error:}at15
error:missing
enter string containing delimiters: 
enter string containing delimiters: a{b(c]d}e
error:]at5
enter string containing delimiters:

隊列:rem

採用先進先出,先存入的數據先被讀出。字符串

插入:get

隊頭+1,隊尾不變input

刪除:

隊尾+1,隊頭不變

循環隊列:

避免隊列不滿但不能插入新的數據,能夠讓隊頭隊尾指針繞回數組開始的位置。

class Queue {
	private int maxSize;
	private long[] queArray;
	private int front;
	private int rear;
	private int nElems;
	public Queue(int s)
	{
		maxSize = s;
		queArray = new long[maxSize];
		front = 0;
		rear = -1;
		nElems = 0;
	}
	public void insert(long j)
	{
		if(rear == maxSize - 1);
		rear = -1;
		queArray[++rear] = j;
		nElems++;
	}
	public long remove()
	{
		long temp = queArray[front++];
		if(front == maxSize)
			front = 0;
		nElems--;
		return temp;
	}
	public long peekFront()
	{
		return queArray[front];
	}
	public boolean isEmpty()
	{
		return (nElems==0);
	}
	public boolean isFull()
	{
		return (nElems==maxSize);
	}
	public int size()
	{
		return nElems;
	}
}
class QueueApp
{
	public static void main(String[] args)
	{
		Queue theQueue = new Queue(5);
		theQueue.insert(10);
		theQueue.insert(11);
		theQueue.insert(12);
		theQueue.insert(14);
		theQueue.remove();
		theQueue.remove();
		theQueue.remove();
		theQueue.insert(77);
		theQueue.insert(88);
		theQueue.insert(99);
		theQueue.insert(77777);
		while(!theQueue.isEmpty())
		{
			long n = theQueue.remove();
			System.out.println(n);
			System.out.println(" ");
		}
		System.out.println(" ");
	}
}
相關文章
相關標籤/搜索