棧是常見的數據結構,stack可以說是內存中具有重要的用途,比如說在JVM中就有本地方法棧,在方法的調用中會產生調用棧,在主棧裏面調用方法/函數(C語言也是如此),臨時變量或者局部變量都會在stack結構中,stack是一種臨時的內存模型,調用棧在方法退出時系統會得到回收。在微機系統中常會遇到中斷的情況,從中斷請求到保護斷點以及中斷程序響應執行與返回整個過程都與棧結構密切相關。
棧簡單地說就是一種的先進後出的結構。一般情況下有入棧(push)與出棧(pop)基本操作。
下面創建一個數據棧,棧存放的數組。通常除了push、pop操作之外,還常有peek(查看)、判斷是否棧容量來決定棧是否full或者Empty狀態。
class StackDesign
{
private int length=0;
private int top=-1;
int[] a=null;
public StackDesign(int length)
{
this.length=length;
a=new int[this.length];
}
public void push(int data)
{
a[++top]=data;
}
public int pop()
{
int value=0;
value=a[top--];
return value;
}
public boolean isEmpty()
{
return top==-1;
}
public boolean isFull()
{
return top==this.length-1;
}
}
以上對類StackDesign的設計基於數據先進後出的思想。在push之前需要判斷stack是否isFull,在pop數據之前需要判斷stack是否isEmpty。這些都是保證stack安全穩定工作必要的判斷。
以下是測試代碼:
StackDesign stackApp=new StackDesign(10);
stackApp.push(6);
stackApp.push(7);
stackApp.push(8);
stackApp.push(9);
while(!stackApp.isEmpty())
{
System.out.println(stackApp.pop());
}
測試結果是:
9
8
7
6
通過以上的結果來看,類StackDesign符合先進後出的基本特徵。stack使用比較廣泛,比如說字符串反轉,分隔符匹配等,總之凡是符合先進後出的條件均可以考慮stack結構來實現。
下面給出使用stack結構實現字符串反轉功能。
class StringReverse
{
char[] buffer=null;
String s=null;
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
public String getWord()
{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
System.out.println("please input String :");
try {
s=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}finally
{
try {
br.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
}
public void reverse()
{
buffer=new char[this.getS().length()];
System.out.println(buffer.length);
for(int i=0;i<buffer.length;i++)
{
buffer[i]=this.getS().charAt(i);
}
}
public void reverseShow()
{
String sbuffer="";
for(int i=buffer.length-1;i>=0;i--)
{
sbuffer+=buffer[i]+"";
}
System.out.println(sbuffer);
}
}
字符創由用戶輸入所得。下面是測試代碼:
StringReverse a=new StringReverse();
String ddd=a.getWord();
a.reverse();
a.reverseShow();
以下是測試結果:
please input String :
XYZ
3
ZYX
以上採用先進後出的思想只需要通過charAt()方法split各個字符後進行push即可。
在常見的IDE種,經常會自動提示匹配符的情況。例如{([] ) }這種情況下系統不會提示錯誤,但是系統檢測到用戶輸入的文本中匹配符是這種情況系統就會提示:
{[( ]} 因爲少了一個‘)’,編譯器具備這種功能可以通過stack實現。具體過程爲:當檢測到左匹配符時順序push壓棧,當檢測到右匹配符時對棧中的左匹配符進行匹配,若匹配成功則pop左匹配符。沒找到左匹配符或者無匹配情況則系統輸出提示信息。以下是實現代碼:
class StackX
{
private int length=0;
int top;
char[] a=null;
StringGet sg=null;
public StackX()
{
a=new char[100];
}
public void push(char ch)
{
a[++top]=ch;
}
public char pop()
{
char value=0;
value=a[top--];
return value;
}
public boolean isEmpty()
{
return top==-1;
}
public boolean isFull()
{
return top==100;
}
}
以上是創建一個基本的stack結構。
class StringGet
{
private int length=0;
String s;
InputStreamReader isr=null;
BufferedReader br=null;
public StringGet()
{
isr=new InputStreamReader(System.in);
br=new BufferedReader(isr);
}
public String str()
{
try {
System.out.println("請輸入字符串:");
s=br.readLine();
} catch (IOException e)
{
e.printStackTrace();
}finally
{
try {
br.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return s;
}
}
以上創建類StringGet並獲取用戶輸入的字符串(包括匹配符)。
class Check
{
char[] charBuffer=null;
int length;
StackX stack=null;
StringGet stringGet=null;
public Check()
{
stringGet=new StringGet();
length=stringGet.str().length();
charBuffer=new char[length];
for(int i=0;i<length;i++)
{
char ch=stringGet.s.charAt(i);
charBuffer[i]=ch;
}
}
public void checkMatching()
{
stack=new StackX();
boolean flag=false;
for(int i=0;i<charBuffer.length;i++)
{
switch(charBuffer[i])
{
case '{':stack.push(charBuffer[i]); break;
case '(':stack.push(charBuffer[i]); break;
case '[':stack.push(charBuffer[i]); break;
case ']':
for(int j=0;j<charBuffer.length;j++)
{
if(stack.a[j]=='[')
{
System.out.println(stack.pop());
flag=true;
}
}
if(!flag)
{
System.out.println("you should check code: short of '['");
}
break;
case ')':
for(int j=0;j<charBuffer.length;j++)
{
if(stack.a[j]=='(')
{
System.out.println(stack.pop());
flag=true;
}
}
if(!flag)
{
System.out.println("you should check code: short of '('");
}
break;
case '}':
for(int j=0;j<charBuffer.length;j++)
{
if(stack.a[j]=='{')
{
System.out.println(stack.pop());
flag=true;
}
}
if(!flag)
{
System.out.println("you should check code: short of '{'");
}
break;
default :break;
}
}
}
}
以上是check類,主要是完成匹配過程。
Check check=new Check();
check.checkMatching();
以上是測試語句。測試結果如下:
請輸入字符串:
xyz[]
[
請輸入字符串:
xyz]
you should check code: short of '['
可以看出以上能夠實現基本的匹配符檢測功能。對於更復雜的匹配符檢測與匹配則需要完善check類,才能檢測出多個匹配符嵌套的匹配。