導航:首頁 > 編程語言 > java波蘭式

java波蘭式

發布時間:2024-04-11 03:40:34

A. java B/S模式

在Java B/S開發模式有以下幾種:
一、JSP+JDBC
這是最簡單的一種開發模式是頁面+邏輯處理,映射到技術上反應出來的有Jsp+Jdbc,在基於這類的實現中在View層也就是jsp頁面上負責數據的顯示、邏輯處理,結合jdbc完成數據的持久化,在小型的項目中,人們確實發現這種方式是最為方便的,但在復雜的項目以及需求不斷變化的項目中,人們慢慢的發現這種方式造成了不少的問題,首先是調試的問題,想想在一個jsp頁面中進行排錯是多麼的困難,其次是修改的問題,為了滿足用戶需求的一個小小的變化,都需要去改不少的頁面,而且很多時候由於寫的時間長了,自己都需要回憶很久才能想起是怎麼回事,更不用說如果人員流動了會怎麼樣,同時還帶來開發效率的問題,由於需要缺少足夠的調試的支持,需要較為熟練的開發人員才能快速的完成,對於一般的人員來說需要一定的適應和學習過程,當然伴隨而來的還有諸如修改界面的時候一不小心少了點代碼什麼造成的錯,最大的問題可能還是重用的問題,通常會造成N多同樣的代碼在頁面上來去的,總結下來在這種模式下有幾個比較重大的問題就是:
1、調試問題。
2、維護問題,顯示和邏輯處理在一起導致了修改顯示的時候較為困難,至於修改代碼則因為之前的調試問題導致了困難,同時由於邏輯均在頁面上後期接手人員需要一段時間去理解。
3、代碼重用性問題。
但同樣它還是存在優點的,那就是可以很快的上手,但由於調試和維護性問題確實太大了,所以在現在也是基本不再採用這種方式了。
二、JSP+JavaBean
在經歷了jsp+jdbc階段後,開始考慮怎麼樣去解決上面三個問題,這個時候就誕生了諸JSP+JavaBean這樣的技術體系,在這個體系中由jsp頁面負責顯示以及接收頁面請求,並調用相應的JavaBean來完成邏輯處理,在獲取其返回的處理數據後轉到相應的頁面進行顯示。在這樣的技術體系中,由於邏輯是由JavaBean來完成的,可以對其進行調試了,代碼的重用性一定程度上也得到了提高。剛開始的時候用這樣的技術體系確實發現比以前用jsp+jdbc爽了很多,但隨著用多了,慢慢又發現了問題,那就是在頁面中需要編寫對於頁面請求數據的獲取,還得根據請求去調用相應的javabean,並根據javabean的處理結果轉入相應的頁面,這同樣造成了修改的麻煩,畢竟是去頁面上修改這些邏輯,總結下來在這種Java B/S開發模式下有比較重大的問題就是:
1、代碼重用性以及維護性問題。但這里的代碼重用性問題和jsp+jdbc的就不同,在邏輯處理部分現在已經可以重用了,但現在在各個頁面就不得不重復的寫獲取頁面請求的參數、相應的調用Model、根據Model的處理結果轉發頁面,這樣的話就導致了在改的時候需要到處去找,造成了維護的復雜。
2、系統結構不清晰。畢竟仍然是在頁面控制整個響應頁面事件的處理流程,這個時候就造成了很多頁面中出現完全相同的jsp代碼,而且控制代碼在頁面,仍然是不便操作,例如對於JavaBean的調用等,而且由於獲取javabean的數據需要轉發的緣故,其實通常就是在最終的顯示頁面上加上上面的控制事件處理流程的代碼,並沒有真正的做到顯示和處理的分離。
同樣,它的優點在於分離了顯示和業務邏輯處理,增強了可調試以及維護性,而且也是很容易上手的,對於小型項目來說仍然是可選的方案之一。
三、基於MVC Framework
在經歷了上面的Jsp+JavaBean的Java B/S開發模式後,我們發現其實現在最需要的就是在jsp、javabean之間能有個東西自動完成頁面請求數據的封裝、根據請求調用相應的javabean、同時根據javabean的處理結果返回至相應的View,有了這樣的思想後,發現smalltalk中的MVC思想很適合這種場景,於是便在Java B/S開發中引入了MVC思想,在這里也簡單的介紹下MVC思想,MVC強調View和Model的分離,View所面對的是Controller,由Controller負責與Model進行交互,View只負責顯示頁面以及顯示邏輯的處理,顯示邏輯指的是諸如第一行要顯示藍色、第二行要顯示紅色這樣的顯示方面的處理,Controller負責接受頁面請求,並將其請求數據進行封裝,同時根據請求調用相應的Model進行邏輯處理,在Model處理後返回結果數據到Controller,Controller將根據此數據調用相應的View,並將此數據傳遞給View,由View負責將數據進行融合並最終展現。MVC帶來的優點很明顯的體現出來了,基於一個這樣的MVC Framework的話開發人員可以按照一種固定的模式進行開發,規范了整個開發過程,提高了質量以及系統結構的清晰性,並由於保證了View/Model的分離,使得一個Model可以對於多種顯示形式的View,需要的僅僅是去改變View和Controller。
按照MVC思想,最容易想到的實現方案莫過於jsp+servlet+javabean,在這裡面jsp對應著View,servlet對應著Controller,javabean對應著Model,因為採用servlet可使用servlet container已經封裝好的頁面數據請求對象HttpServletRequest,這樣就省去了自己封裝頁面請求數據的工作,作為Controller同時還需要承擔根據請求調用對應的javabean,最簡單的做法無非就是在Servlet中直接根據某種邏輯(諸如反射或介面)調用相應的bean進行執行,之後將HttpServletRequest、HttpServletResponse作為參數傳入javabean進行處理,javabean從HttpServletRequest中獲取請求數據,將返回的結果數據放入HttpServletResponse,整個過程結束後繼續由Controller接手進行處理,這個時候作為Controller的servlet將根據處理的結果返回相應的頁面,在這個模型使用時人們慢慢的發現了一個問題,那就是隨著jsp、javabean的變化造成了controller的不斷修改,需要修改其中調用相應javabean以及轉發相應頁面的部分,為了解決這個問題,首先想到的是應該分離根據請求調用相應javabean的步驟,這個時候採用了設計模式中的front controller+application controller的方法,front controller負責接受頁面請求並進行封裝,同時將此數據對象傳遞至application controller,由application controller來負責調用相應的bean,這樣的設計其實都是遵循著一個設計原則,就是職責單一,通常實現application controller的模式是Command模式,在這種情況下MVC Framework的結構體系就演變成了view+controller(front+application)+model。
在完成了上述演變後慢慢又發現了一個問題,就是model依賴於了httpservletrequest,這樣造成的一個問題就是沒法測試,仍然要不斷重啟伺服器來測試,當然與此同時的發展是model層的細化,細化成用於響應頁面請求的action Layer+Domain Model Layer+Persistent Layer,在這里不去討論後面層次的問題,因為作為MVC Framework它並不管你Model層是怎麼個處理流程的。
慢慢也發現了另外一個問題,那就是變化經常要影響到controller的修改,於是便引入了採用配置文件的解決方法,編寫action的配置文件,在配置文件中控制根據action的返回結果轉入相應的View,這樣的話在將來需要改變的時候只需要去改變這個配置文件就可以了,保證了Controller的穩定,這是典型的設計中的重點考慮因素,分離變化和不變化的,讓變化造成的影響最小。
但在引入了上面的配置文件後,慢慢又發現了問題,那就是手寫配置文件總是容易出各種各樣的問題,這個時候採用圖形化的界面來生成配置文件的想法又有了,這也就造就了page flow的誕生,當然,這只是page flow的一小部分功能。
當然,隨著MVC的發展,也帶動了其他相關技術的發展,如非同步請求/響應模式(ajax、amowa)等。

B. java如何計算比較復雜的數學計算,比如有括弧同時有+-*/,順序不一定,就是一個運算公式

可以用編譯原理的思想來理解,主要用到數據結構裡面的棧和隊列。
利用棧的後進先出以及運算符號(+-*/(){} )優先順序,對運算符號進行匹配。
分兩個棧,一個是符號棧,一個是數字棧。
棧的每一次pop出一個字元,要進行校驗,如果匹配(符合運算規則)則計算,並保存結果到數據棧。

C. java 中|| 和 && 這類的符號都表示什麼

&&和||是一種邏輯運算符,&&是邏輯與,當兩個數都為真,則結果為真。||是邏輯或,兩個數任意一個為真,則結果為真。

舉個例子:

1、a && b

當a、b都為真時,結果為真。有一個為假或者都為假時結果為假。

2、a || b

當a、b有一個為真時,結果為真。a、b都為假時結果為假。

(3)java波蘭式擴展閱讀:

在java中還有其他的邏輯符號,比如:!、|、 &

「!」是非運算符號,比如a為真,則!a則為假。a如果為假,則!a為真。

而「|」也是邏輯或,「&」也是邏輯與,但是他們與「||」和「&&」有些區別,區別如下:

「&」與「|」無論第一個判斷條件是否成立,邏輯運算符前後兩個條件都會進行判斷。

「&&」與「||」,前者第一個條件不成立,後面的條件均不進行判斷,返回false;後者第一個條件成立,後面的條件均不進行判斷,返回true。

D. 怎樣用JAVA寫出逆波蘭表達式求值部分的源代碼(提供代碼框架)

下面的代碼是用來計算表達式的,看看是不是你要的
public class OPNode {
char op;// 運算符號
int level;// 優先順序
//設置優先順序
public OPNode(String op) {
this.op = op.charAt(0);
if (op.equals("+") || op.equals("-")) {
this.level = 1;
} else if (op.equals("*") || op.equals("/")) {
this.level = 2;
} else if (op.equals("(")) {
this.level = -3;

} else {
this.level = -1;
}
}
}
//主類
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class OPText {
public static void main(String[] args) {
String expression = "2+2+(8-2)/3";// 要計算的表達式
List list = new LinkedList();
//正則式
Pattern entryOfExpression = Pattern
.compile("[0-9]+(\\.[0-9]+)?|\\(|\\)|\\+|-|\\*|/");
Deque stack = new LinkedList();//棧
Matcher m = entryOfExpression.matcher(expression);
while (m.find()) {
//提取語素
String nodeString = expression.substring(m.start(), m.end());
if (nodeString.matches("[0-9].*")) {
list.add(Double.valueOf(nodeString));//如果是數字直接送入列表
} else {
OPNode opn = new OPNode(nodeString);//如果是運算符
int peekLevel = (stack.peek() == null) ? 0 : ((OPNode) stack
.peek()).level;
if (opn.level >=peekLevel) {
stack.push(opn);//新的運算符比舊的優先順序別高則入棧
} else {
if (opn.level == -1) {
OPNode temp = (OPNode) stack.pop();
while (temp.level != -3) {//如果為"("則一直出棧一直到")"
list.add(temp);
System.out.println(nodeString);
temp = (OPNode) stack.pop();
}
} else if (opn.level == -3) {
stack.push(opn);
} else {//如果新運算符比棧頂運算符底則一直出棧
OPNode temp = (OPNode) stack.pop();
while (temp.level > opn.level) {
list.add(temp);
if (stack.isEmpty()) {
break;
}
temp = (OPNode) stack.pop();
}
stack.push(opn);
}
}
}

}
OPNode temp = null;
while (!stack.isEmpty()) {
temp = (OPNode) stack.pop();
list.add(temp);
}//後續表達式計算
stack.clear();
for (Object o : list) {
if (o instanceof Double) {
stack.push(o);//為數字入棧
} else {
double op2 = ((Double) stack.pop()).doubleValue();
double op1 = ((Double) stack.pop()).doubleValue();
switch (((OPNode) o).op) {
case '+':
stack.push(op1 + op2);
break;
case '-':
stack.push(op1 - op2);
break;

case '*':
stack.push(op1 * op2);
break;

case '/':
stack.push(op1 / op2);
break;
}

}
}
System.out.println("結果為:" + stack.pop());
}

}
呃,太晚了,沒心思去改了
明天再說

E. java :轉變為逆波蘭表示式的代碼報錯:堆棧溢出,怎麼解決

while(Character.isDigit(chars[i])||chars[i]=='.') {
s.append(chars[i]);
}
這一段是死循環。。stack一直追加參數,所以溢出了

F. JAVA包含哪三個版本,每個版本有什麼功能,各個版本的應用領域

JAVA的三個版本及其功能應用領域介紹如下:

1、JavaSE(Java Standard Edition)

也稱為J2SE,標准版本。用於伺服器、桌面、嵌入式環境和實時環境中使用的 Java 應用程序。Java SE 包含了支持 Java Web 服務開發的類,並為 Java Platform,Enterprise Edition(Java EE)提供基礎。

2、JavaEE(Java Enterprise Editon)

也稱為J2EE,是企業版本幫助開發和部署可移植、健壯、可伸縮且安全的伺服器端Java 應用程序。Java EE 是在 Java SE 的基礎上構建的,它提供Web服務、組件模型、管理和通信 API,可以用來實現企業級的面向服務體系結構(service-oriented architecture,SOA)和 Web 2.0 應用程序。

3、JavaME(Java Micro edition)

也稱為J2ME,是網路這一塊的,Java ME 為在移動設備和嵌入式設備(比如手機、PDA、電視機頂盒和列印機)上運行的應用程序提供一個健壯且靈活的環境。

Java ME 包括靈活的用戶界面、健壯的安全模型、許多內置的網路協議以及對可以動態下載的連網和離線應用程序的豐富支持。基於 Java ME 規范的應用程序只需編寫一次,就可以用於許多設備,而且可以利用每個設備的本機功能。

(6)java波蘭式擴展閱讀

Java本來就是為了嵌入式系統而生,1990年12月,Sun公司內部 由James Gosling、Patrick Naughton以及Mike Sheridan成立了一個叫做Green Team的小組。

Green Team小組的主要目標,是要發展一種新架構,而這種架構必須能夠在消費性電子產品作業平台上運行,現在我們普遍認識的PDA、手機或是信息家電 (IA),都是屬於這種架構的目標平台。雖然在1999年,Java被分割成J2ME、J2SE、J2EE,所以有了J2ME這個名詞的出現。

但是 Java並非1999年才開始發展嵌入式系統上的應用。其實,Java本來就是為了嵌入式系統而發展的一種架構。即使目前大家多半將Java的應用聚焦於 企業上的J2EE應用。但是嚴格來說,J2ME才是Java真正「回歸本心」的領域。

J2EE組件和「標準的」 Java類 的不同點在於:它被裝配在一個J2EE應用中,具有固定的格式並遵守J2EE規范,由J2EE伺服器對其進行管理。

J2EE規范是這樣定義J2EE組件 的:客戶端應用程序和applet是運行在客戶端的組件;Java Servlet和Java Server Pages (JSP) 是運行在伺服器端的Web組件;Enterprise Java Bean (EJB )組件是運行在伺服器端的業務組件。

G. 什麼是逆波蘭式

逆波蘭式
開放分類: c程序

逆波蘭式也叫後綴表達式(將運算符寫在操作數之後)
如:我們平時寫a+b,這是中綴表達式,寫成後綴表達式就是:ab+
(a+b)*c-(a+b)/e的後綴表達式為:
(a+b)*c-(a+b)/e
→((a+b)*c)((a+b)/e)-
→((a+b)c*)((a+b)e/)-
→(ab+c*)(ab+e/)-
→ab+c*ab+e/-
將一個普通的中序表達式轉換為逆裂桐波蘭表達式的一缺衡般演算法是:
1)首先構造一個運算符棧,此運算符在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入一個用中綴表示的簡單算術表達式,為方便起見,設該簡單算術表達式的右端多加上了優先順序最低的特殊符號「#」。
(3)從左至右掃描該算術表達式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算符,此時需比較優先關系。
做法如下:將該字元與運算符棧頂的運算符的優先關系相比較。如果,該字元優先關系高於此運算符棧頂的運算符,則將該運算符入棧。倘若不是的話,則將棧頂的運算符從棧中彈出,直到棧頂運算符的優先順序低於當前運算符,將該字元入棧。
(5)重復上述操作(1)-(2)直至掃描完整個簡單算術表達式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術表達式轉化為逆波蘭表示的簡單算術表達式。

typedef int SElemType;

typedef struct SqStack

{ char *base;

char *top;

char stacksize;

}SqStack;

程序

void InitStack (SqStack &S)

{

S.base=(char *) malloc (STACK_INIT_SIZE *sizeof(char));

if (!S.base)

exit (OVERFLOW); //為棧S分配存儲空間失敗

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

}

int Push(SqStack &S,char ch)

// 將元素e插入到棧S中,成為新的棧頂元素

{

if (S.top-S.base>S.stacksize) //Stack==full?

{ S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT *sizeof(char)));

if (!S.base)

{ printf(「Failure to reallocate the Memory units!:\n」);

exit(OVERFLOW);

}

S.top=S.base+S.stacksize; //To Modify pointer of Satck top

S.stacksize+=STACKINCREMENT; //To modify the size of stack

} // end of if

*S.top++=ch; //先將e送入棧頂指針所指向的單元,再將棧頂指針加1

return(OK);

} //end of Push() subfunction

int Pop(SqStack &S,char &ch)

{

if (S.top==S.base)

{

printf(「下溢!」);

return (ERROR);

}

ch=*--S.top;

return (OK);

}

void Translation()

{//將算術表達式轉化伏源做為逆波蘭表達式,num為算術表達式的字元總個數

int i,j;

char str[100],exp[100],ch;

SqStack S;

InitStack(S);

i=1;

printf(「 請輸入算術表達式字元串,求其逆波蘭表達式,以#為結束標志,如a-b*c/(3+6)#:\n」);

do

{

scanf(「%c」,&str);

i++;

}while(str[i-1]!=』#』);

str[0]=』(『; //將表達式放在()內

str[i-1]=』)』;

str=』#』;

i=0;

j=0;

while(str!=』#』)

{ if((str>=』0』 &&str<=』9』)||(str>=』a』 &&str<=』z』))

{

exp[j]=str;

j++;

} //end of if

else if(str==」(」)

Push(S.str);

else if(str==』)』)

{ while(*(S.top-1)!=』(』)

//將S中左括弧「(」以前的所有字元依次彈出並存入數組exp中

{ Pop(S,ch); exp[j]=ch; j++; }

S.top--;

} //end of elseif

else if(str==』+』||str==』-』) //如果判定為「+」號或「-」號,則做如下操作

{ while((s.top!=S.base)&&(*(S.top-1)!=』(』))

//將S中左括弧「(」以前字元依次彈出並存入數組exp 中

{ Pop(S,ch); exp[j]=ch; j++; }

Push(S,str);

} //end of else if

else if (str==』*』||str==』/』)

{

while((*(S.top-1)==』*』)||(*(S.top-1)==』/』))

{ Pop(S,ch); exp[j]=ch; j++; }

Push(S,str);

} //end of else if

i++;

} //end of while

exp[j]=』#』;

printf(「\n\n輸入的算術表達式」);

i=1;

while(str[i+1]!=』#』)

{ printf(「%c」,str);

i++;

} //end of while

printf(「 逆波蘭表達式為:\n」);

i=0;

while(exp!=』#』)

{ printf(「%c」,exp); i++; }
}
void main()
{
Translation();
printf(「\n」);
printf(「…OK…!」)
getch();
}

閱讀全文

與java波蘭式相關的資料

熱點內容
程序員長期變胖 瀏覽:628
平板怎麼創建圖標文件夾 瀏覽:219
alphafrance製作的影片 瀏覽:281
小電影網站有那些 瀏覽:191
護工韓國倫理電影 瀏覽:899
母乳人妻倫理片 瀏覽:844
電影院被強行猛插 瀏覽:208
80年代台灣老電影紅樓夢 瀏覽:278
大疆帶屏控如何安裝app 瀏覽:946
國產大胸電影 瀏覽:706
模擬器中的pco的命令提示窗口 瀏覽:874
蘿卜雙端源碼 瀏覽:873
魔域gm易語言工具源碼 瀏覽:452
機械設計手冊pdf電子版 瀏覽:98
為什麼網吧伺服器會掉盤 瀏覽:526
文電通pdf套裝版4 瀏覽:327
如何使用百度地圖伺服器地址 瀏覽:921
吉林租伺服器託管雲伺服器 瀏覽:781
中越反擊戰電影全集 瀏覽:116
溯源碼驗證碼無效 瀏覽:354