java数据结构五、栈

        <!-- Generated by javadoc (build 1.6.0-beta2) on Fri Mar 09 12:52:21 CST 2007 -->

      Stack 类表示后进先出(LIFO)的对象堆栈。JDK中java.util.Stack通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 pushpop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

         数据项入栈和出栈的时间复杂度都为0(1),也就是说栈操作所耗费的时间不依赖于栈中数据项的个数,因此操作时间很短。栈不需要比较和移动操作。

         栈应用:

         1、单词逆序

              将单词字符逐个入栈(push),最后逐个出栈(pop),实现了单词的逆序过程。不过JDK中java.lang.StringBuffer中实现了字符串逆序的方法reverse,该方法是通过一下方式来实现字符串的逆序的:

String st = new String("this is ok 可 以 吗ert tyu?");
		char [] value = st.toCharArray();
		int count =value.length;
		int n = count - 1;
//此处通过位运算符来实现除以2操作,通过循环实现char数组内容的首尾互换
		for (int j = (n-1) >> 1; j >= 0; --j) {
			System.out.println(j);
		    char temp = value[j];
		    char temp2 = value[n - j];
		    value[j] = temp2;
		    value[n - j] = temp;
		}
		for (int i = 0; i < value.length; i++) {
			System.out.println(value[i]);
		}
 

               2、分隔符匹配

               栈经常被用于解析某种类型的文本串。大学时代学习过的汇编语言,编译器就是通过栈来解析计算机语言所写的代码的。

               分隔符匹配程序从字符串中不断读取字符,每次读取一个字符,若发现它是左分隔符,就将它压入栈中,若读入一个右分隔符时,弹出栈顶的左分隔符,看是否匹配,若不匹配则报错,如果最后栈中存在未被匹配的左分隔符,也报错。

 public void check()
      {
      int stackSize = input.length();      // get max stack size
      StackX theStack = new StackX(stackSize);  // make stack

      for(int j=0; j<input.length(); j++)  // get chars in turn
         {
         char ch = input.charAt(j);        // get char
         switch(ch)
            {
            case '{':                      // opening symbols
            case '[':
            case '(':
               theStack.push(ch);          // push them
               break;

            case '}':                      // closing symbols
            case ']':
            case ')':
               if( !theStack.isEmpty() )   // if stack not empty,
                  {
                  char chx = theStack.pop();  // pop and check
                  if( (ch=='}' && chx!='{') ||
                      (ch==']' && chx!='[') ||
                      (ch==')' && chx!='(') )
                     System.out.println("Error: "+ch+" at "+j);
                  }
               else                        // prematurely empty
                  System.out.println("Error: "+ch+" at "+j);
               break;
            default:    // no action on other characters
               break;
            }  // end switch
         }  // end for
      // at this point, all characters have been processed
      if( !theStack.isEmpty() )
         System.out.println("Error: missing right delimiter");
      }  // end check()
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值