1. 程式人生 > >資料結構java語言實現之棧及其應用

資料結構java語言實現之棧及其應用

 棧的結構比較簡單,跟連結串列差不多底層還是一個數組,程式碼實現也比較容易,主要利用的就是他的先進後出的特點,java程式碼如下:

<span style="font-size:14px;">package Stack;
/*
 * 棧的實現
 * 基本思路還是利用陣列來做實現
 */
public class MyStack {
	private static final int DEFUALT_LENGTH=10;
	private int theLength=0;
	private Object[] theItems;
	
	/*
	 * 構造一個空棧
	 */
	public MyStack(){
		clearStack();
	}
	
	/*
	 * 銷燬一個棧
	 */
	public void destroyStack(){}
	
	/*
	 * 清空一個棧
	 */
	public void clearStack(){
		theLength=0;
		ensureCapacity(DEFUALT_LENGTH);
	}
	
	/*
	 * 判斷一個棧是否為空
	 */
	public boolean isEmpty(){
		return theLength==0;
	}
	
	/*
	 * 返回棧的長度
	 */
	public int stackLength(){
		
		return theLength;
	}
	
	/*
	 * 返回棧頂元素
	 */
	public Object geTop(){
		if(isEmpty()){
			throw new IndexOutOfBoundsException();
		}
		Object obj=theItems[theLength-1];
		//theLength--;
		return obj;
	}
	
	/*
	 * 壓棧
	 */
	public void push(Object obj){
		if(theLength>=theItems.length){
			ensureCapacity(theLength*2+1);
		}
		theItems[theLength]=obj;
		theLength++;
	}
	
	/*
	 * 出棧
	 */
	public Object pop(){
		if(isEmpty()){
			return null;
		}
		Object obj=theItems[theLength-1];
		theLength--;
		//ensureCapacity(theLength);
		return obj;
	}
	
	/*
	 *陣列的擴充套件
	 */
	public void ensureCapacity(int newCapaciyty){
		if(theLength>newCapaciyty){
			return;
		}
		Object [] old=theItems;
		theItems=new Object[newCapaciyty];
		for(int i=0;i<theLength;i++){
			theItems[i]=old[i];
		}
	}
}
</span>
實現還是比較簡單的,下面來幾個實際應用:

1  十進位制數轉換成其他任意進位制的數,這個原理很簡單,將迭代的餘數倒過來輸出即可

程式碼如下:

<span style="font-size:14px;">///十進位制數轉換成其他任意進位制的數
	private static String toOther(int tenNum, int otherNum) {
		// TODO Auto-generated method stub
		MyStack ms=new MyStack();
		int result=0;
		String results="";
		while(tenNum!=0){
			result=tenNum%otherNum;
			ms.push(result);
			tenNum=tenNum/otherNum;
		}
		result=0;
		while(!ms.isEmpty()){
			results+=ms.pop()+"";
		}
		return results;
	}</span>
測試程式碼
    System.out.println("請輸入一個十進位制的數");
    int tenNum=sc.nextInt();
    System.out.println("請輸入要轉換的進位制數");
    int otherNum=sc.nextInt();
    String resultnum=toOther(tenNum,otherNum);
    System.out.println(resultnum);
結果如下:

請輸入一個十進位制的數
12
請輸入要轉換的進位制數
8
14

2 表示式的求值   ,直接上程式碼

//表示式的的求值
	/*
	 * 基本的原理是,構建兩個棧,一個用來存放運算元,一個用來存放運算子
	 * 依次輸入表示式中的每一個字元,
	 * 若是數字則直接將數字壓入存放運算元的那個棧
	 * 若是運算子則與運算子的棧頂元素進行比較,
	 * 如果運算子的優先順序低於棧頂元素,就要彈出兩個運算元和一個運算子進行運算操作
	 * 如果運算子的優先順序高於棧頂元素,就直接將運算子壓棧
	 * 如果是等於(在次規定只有”(“與“)”是想等的其他的相等取大於)
	 */
	
	/*
	 * 運算操作,根據兩個運算元和傳入的運算子來進行計算
	 */
	private static double operate(double x,double y,char operator){
		double result=0.0;
		switch (operator){
		case '+':
			result=x+y;
			break;
		case '-':
			result=x-y;
			break;
		case '*':
			result=x*y;
			break;
		case '/':
			result=x/y;
			break;
		}
		
		return result;
	}

	/*
	 * 比較兩個運算子的優先順序,第一個引數是存放運算子的棧頂元素,第二個引數是要壓入的元素。
	 * 正數表示大於,0表示等於,負數表示小於
	 */
	private static int precede(char stackTop,char toPush){
		int result=-1;
		if(stackTop=='-')
			stackTop='+';//這裡是比較優先順序,所以同一個優先順序的運算子可以看作是一樣的,方便與下面的陣列操作
		if(stackTop=='/')
			stackTop='*';
		if(toPush=='-')
			toPush='+';
		if(toPush=='/')
			toPush='*';
		char [] operators=new char[]{'#',')','+','*','('};
		if((stackTop=='('&&toPush==')')||(stackTop=='#'&&toPush=='#')){///這裡面只有這一種情況,因為運算子的棧必須是先有(,而且一旦遇到)除非出錯否則就會立刻彈出兩個括號
			result=0;
		}else{
			int inOfTop=getIndex(stackTop, operators);//得到棧頂元素的下標
			int inOfPush=getIndex(toPush, operators);
			if(inOfPush==-1||inOfTop==-1){
				throw new IndexOutOfBoundsException();//如果返回值是-1則表示不存在,這是出錯的情況,先丟擲異常。
			}else{
				if(inOfTop>=inOfPush){//相等或者大於軍則返回正值
					result=1;
				}else{
					result=-1;
				}
			}
		}
		return result;
	}
	
	//用於返回字元在再付陣列中的位置
	private static int getIndex(char ele,char[] chars){
		int index=-1;
		for(int i=0;i<chars.length;i++){
			if(chars[i]==ele){
				index=i;
				break;
			}
				
		}
		return index;
	}
	
	//判斷是不是字元
	private static boolean isChar(char ele){
		boolean flage=true;
		if(ele>='0'&&ele<='9')
			flage=false;
		return flage;
	}
	/*
	 * 真正開始操作
	 */
	private static double getResult(String evalueExpression){
		double result=0.0;
		//構建兩個棧
		MyStack Optr=new MyStack();//存放運算子的棧
		Optr.push('#');
		MyStack Opnd=new MyStack();//存放數字的棧
		int i=0;
		char[] chars=evalueExpression.toCharArray();//轉換成字元陣列
		char operOrType=' ';
		while(!Optr.isEmpty()){
			if(i<chars.length){
				operOrType=chars[i++];
			}
			char typeTop=(char) Optr.geTop();
			if(!isChar(operOrType))//不是運算子就直接壓入數字棧
				Opnd.push(operOrType);
			else{
				if(typeTop=='('&&operOrType!=')'){//但棧頂是(就得另說
					Optr.push(operOrType);
				}else{
					switch(precede(typeTop, operOrType)){
					case -1:
						Optr.push(operOrType);
						break;
					case 0://相等就意味著是一對括號或者#相遇,那麼必然的括號裡面的運算操作已經完成,所以要脫去括號
						Optr.pop();
						break;
					case 1://棧頂的優先順序高就先計算,
						double num1=Double.parseDouble(Opnd.pop()+"") ;
						double num2=Double.parseDouble(Opnd.pop()+"");
						char opType=(char) Optr.pop();
						result=operate(num2, num1, opType);
						Opnd.push(result);
						i--;//計算完成之後當前的操作符不能丟,因為前面的計算完成之後還要將其壓棧判斷
						break;
					}
				}
			}
		}
		return result;
	}
測試程式碼:
  System.out.println("請輸入一個算術表示式以#結尾");
  String evalueExpression=sc.nextLine();
  System.out.println(getResult(evalueExpression));
結果如下:

請輸入一個算術表示式以#結尾
3*(3+2/4)+9*6/2#
37.5


相關推薦

資料結構java語言實現及其應用

 棧的結構比較簡單,跟連結串列差不多底層還是一個數組,程式碼實現也比較容易,主要利用的就是他的先進後出的特點,java程式碼如下: <span style="font-size:14px;">package Stack; /* * 棧的實現 * 基本思路還是

資料結構Java語言描述迴圈佇列的兩種實現方式

1、佇列的描述 佇列是一種先進先出的儲存資料的結構。如我們現實生活中的排隊就是一個典型的例子。 2、迴圈佇列及其優點   2.1、迴圈佇列是佇列的擴充套件,就是佇列首尾連線,形成一個閉環的圈子。   2.2、優點   充分利用儲存空間。 3、佇列的實現方式  

資料結構-C語言實現線性

#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//儲存空間初始化分配量 #define STACKINCREAMENT 10//儲存空間分配增量 #defi

0x00資料結構——C語言實現+字尾表示式計算)

0x00資料結構——C語言實現(棧) 棧的實現 /* 棧(tack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。 對棧的基本操作有Push(進棧)和Pop(出棧)。 Functions: (在連結串列中增加

資料結構C語言實現鏈式佇列的6種演算法程式碼

#include <stdio.h>#include <stdlib.h>typedef int elemType;/************************************************************************//* 以下是關於佇列連

[資料結構]c語言實現的入,出,清空,銷燬等操作

最近在學習資料結構中的棧,於是在此記錄一下棧鏈式結構的抽象資料型別 /* 棧的抽象資料型別 ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰元素具有前驅和後繼關係 Operation InitStack(*S):初始化

資料結構與演算法》應用

1、字串的翻轉(逆序) 根據棧“後進先出”的特點,可以利用棧對字串進行反轉,即實現字串的逆序。 藉助於《資料結構與演算法》之棧(2)中的棧結構,相應實現的程式碼如下: public static void ReverString() { BigStack stac

資料結構與演算法】的基本介紹及其陣列、連結串列實現---第四篇

一、棧的基本介紹 1、棧的基本概念 棧是一種限制在一端進行插入和刪除操作的線性表資料結構。棧中有兩個比較重要的操作:push(壓棧:將元素壓入棧頂)和pop(彈棧:從棧頂彈出一個元素)。都滿足先進後出、後進先出的特點! 從圖中可以看出,我們常把棧的上面稱為棧

堆的python實現及其應用 資料結構--堆的實現深入分析

堆的概念 優先佇列(priority queue)是一種特殊的佇列,取出元素的順序是按照元素的優先權(關鍵字)大小,而不是進入佇列的順序,堆就是一種優先佇列的實現。堆一般是由陣列實現的,邏輯上堆可以被看做一個完全二叉樹(除底層元素外是完全充滿的,且底層元素是從左到右排列的)。 堆分為最大堆和最小堆,最大堆

嚴蔚敏資料結構C語言實現的基本操作

int main(){   SqStack S;   SElemType *e;   int n,i;   InitStack(&S);   printf("請輸入需要入棧的資料個數\n");   scanf("%d",&n);   for(i=0;i<n;i++)   {    sca

資料結構(三)

棧是後進先出,先進後出 棧是一種受限制的線性表,只允許一端插入和刪除資料。 棧的實現也有兩種,用陣列實現叫順序棧;用連結串列實現叫鏈式棧。 // 基於陣列實現的順序棧 public class ArrayStack { private String[] items; // 陣列 private i

資料結構-C語言實現順序表

#include<stdio.h> #include<stdlib.h> #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREAMENT 10 #define OK 1

資料結構-C語言實現迴圈佇列

#include<stdio.h> #include<stdlib.h> #define MAXSIZE 100 #define OK 1 #define OVERFLOW -1 typedef struct{ int *base;

資料結構C語言實現-2—線性表

Table of Contents 靜態連結串列 線性表順序儲存結構 #include <stdio.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #de

資料結構-c語言實現連結串列的建立,增刪,翻轉

很經典的課題了,這裡直接給出源程式: #include <stdio.h> #include <stdlib.h> #define LIST_MAX_LEN 10 typedef int ElementType; typedef int BOOL; #define TR

資料結構 c語言實現順序佇列(輸數字入隊,字元出隊)

一.標頭檔案seqqueue.h實現 #ifndef __SEQQUEUE_H__ #define __SEQQUEUE_H__ #include<stdio.h> #include<stdlib.h> #include<stdbool.h&g

資料結構C++語言實現——圖

圖 圖的基本概念 圖是資料結構G=(V,E) V(G)是G中結點的有限非空集合 E(G)是G中邊的有限集合 若圖中代表一條邊的偶對是有序的,則稱為有向圖,<u,v>u稱為該邊的始點(尾) ,v稱為邊的終點(頭)。有向邊也稱為弧。

資料結構--堆的實現深入分析

一,介紹 以前在學習堆時,寫了兩篇文章:資料結構--堆的實現(上)   和   資料結構--堆的實現(下),  感覺對堆的認識還是不夠。本文主要分析資料結構 堆(討論小頂堆)的基本操作的一些細節,比如 insert(插入)操作 和 deleteMin(刪除堆頂元素)操作的實現細節、分析建堆的時間複雜度、堆的

資料結構和演算法》的鏈式儲存結構

        在上篇博文中我已經將棧的順序儲存結構簡單地介紹了一下,也舉了一個進位制轉換的例子,供大家學習參考。這裡將繼續進行棧的有關介紹,本篇博文重點對棧的鏈式儲存結構進行分析。 一,棧的鏈式儲存結構         棧的鏈式儲存結構簡稱棧鏈。棧因為只是棧頂來做插入和刪

資料結構 C語言實現直接插入排序

一、直接插入排序簡介  每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。  第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(