九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

歡迎來到裝配圖網! | 幫助中心 裝配圖網zhuangpeitu.com!
裝配圖網
ImageVerifierCode 換一換
首頁 裝配圖網 > 資源分類 > DOC文檔下載  

數據結構課程設計報告

  • 資源ID:39703536       資源大?。?span id="24d9guoke414" class="font-tahoma">368.52KB        全文頁數:46頁
  • 資源格式: DOC        下載積分:10積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要10積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

數據結構課程設計報告

計算機與信息學院數據結構課程設計實驗報告專 業(yè) 班 級計算機074班學生姓名及學號課程教學班號0002任 課 教 師實驗指導教師實驗地點2008 2009 學年第 二 學期題目1:設計程序完成如下功能:對給定的圖結構,用Kruskal算法的基本思想求解圖的最小生成樹,并給出動態(tài)演示過程題目2:設計一個模擬計算器的程序,要求能包含加、減、乘、除、括號運算符,以及SQRT和ABS對任意整型表達式進行求解。 要求:要檢測運算執(zhí)行的條件并給出錯誤警報 一、動態(tài)演示Kruskal算法1、題目分析及建立模型在圖的算法中,求最小生成樹有著十分重要的理論和現實意義,二Kruskal算法正是求解這一問題的經典算法。Kruskal算法的主要思想即是通過不斷地尋求滿足一定條件(即所選邊不能構成環(huán))的最小權值的邊,直至找出圖的最小生成樹為止。為了能夠動態(tài)地演示Kruskal算法求解最小生成樹的過程,首先的問題是如何動態(tài)的建立一個圖,然后的問題才是怎樣動態(tài)地演示Kruskal算法。所以為了解決這個問題,我從這兩個方面逐一入手進行求解,利用MFC的知識進行演示。2、算法的設計與具體的設計思路A、程序界面的設計 首先為了建立一個圖,需要知道一個圖的節(jié)點數,由于界面有限,這里將節(jié)點數限制在8以內(包括8),超出8個將會給出提示。所以在程序界面中必須有圖節(jié)點數目的輸入,這里設計了一個編輯框用于輸入圖的節(jié)點數目。另外,一個完整的圖還必須有一定的邊信息,包括邊的起始端點和權值,以便求解最小生成樹。而這些信息完全是由用戶確定的,并且由用戶輸入的圖的節(jié)點數確定。這里在用于輸入節(jié)點數的編輯框下設置兩個列表框和一個編輯框分別用于邊的起始端點和權值的輸入。另外,為了使節(jié)點數和邊信息產生關聯,這里又設置了一個“應用”按鈕,為了將邊信息與圖相關聯,又設置了一個“增加邊”按鈕,最后還有一個“動態(tài)演示Kruskal算法”的操作按鈕以及一個退出按鈕。此外,在界面的右端設置一個圖形演示區(qū),已進行動態(tài)演示。完整的程序界面如下:B、按鈕響應函數的設計 在上述界面中有三個主要按鈕,分別是“應用”“增加邊”以及“動態(tài)演示Kruskal算法,下面分別設計其響應函數 “應用”按鈕的主要作用是把圖的節(jié)點數和邊信息和圖相關聯。用戶在編輯框m_vexnum中輸入結點,然后點擊“應用”按鈕后,在兩個列表框m_Start和m_End中自動添加n各結點,同時在演示區(qū)中畫出n個節(jié)點,如下所示:為了關聯相關信息,在CsmileGraph1Dlg中增加如下變量:Graph graph; int vexnum;在按鈕的響應函數OnApply()中完成如下功能,一是在初始化圖graph:/初始化一個圖graph.graph_vexnum = 0;for(int j = 0; j < 8; j+)graph.data j = (char)(A+j);for(int i = 0; i < 8; i+)for(int j = 0; j < 8; j+)graph.AdjMatrix ij = graph.AdjMatrix ji =INF;二是將編輯框中的內容與圖和列表框關聯起來同時在演示區(qū)中繪制n個節(jié)點,如下所示:/輸入圖的節(jié)點數CString s ;m_vexnum.GetWindowText (s);int v_num = (int)atoi(s); /添加圖的相關參數graph.graph_vexnum = v_num;for(int t = 0; t < graph.graph_vexnum ; t+)graph.data t = (char)(A+t);if(v_num<=8&&v_num>0) Draw(v_num);else if(v_num<=0|v_num>8)MessageBox("請輸入1到8之間的一個數!");elseMessageBox("你還沒有輸入結點數!");m_Start.ResetContent();m_End.ResetContent ();for(int k = 0; k < v_num; k+)m_Start.AddString (VexNodek);m_End.AddString (VexNodek);為了在演示區(qū)中繪制n個結點,在OnApply函數中調用函數Draw(v_num);在函數Draw(int n)中繪制n個節(jié)點,為了限制結點個數,在演示區(qū)中固定了8個點供演示。這8個點的組成形式如下:將這8個點保存在Point數組point中,同時以這8個點為中心作8個矩形Rect rcDraw8保存圖的結點的外接矩形,并根據m_vexnum的大小利用MFC繪圖函數繪制m_vexnum內切圓作為圖的結點?!霸黾舆叀卑粹o的主要功能是輸入圖的邊信息并與圖關聯起來,為此在CsmileGraph1Dlg類中增加變量Edge edge56用于保存用戶輸入的邊信息。用戶通過兩個列表框選擇一條邊的兩個端點并把其權值輸入到下面的編輯框中,然后單擊“增加邊”按鈕即可完成:在演示區(qū)中繪制一條邊并顯示其權值,修改圖graph的邊信息,即改變其鄰接矩陣值。這里規(guī)定:兩次輸入同一條邊、輸入的結點不存在、結點相同均視為無效,并給出提示,演示如下: 無效輸入一、一條邊的兩個端點相同 無效輸入二、輸入邊已經存在正常情況下可得到如下所示的圖:以上效果均通過按鈕的響應函數OnAddEdge()來實現:int start,end;/保存一條邊的兩個端點start = m_Start.GetCurSel (); end = m_End.GetCurSel (); CString val ; m_Value.GetWindowText (val);/獲取權值 int value = atoi(val); /處理特殊情況 if(graph.AdjMatrixstartend!=INF) MessageBox("改邊已經存在"); else if(start=LB_ERR|end=LB_ERR) MessageBox("結點不存在!"); else if(start=end) MessageBox("起始端點不應為同一結點!"); else /增加圖的邊 edgeedge_num.start = start; edgeedge_num.end = end; edgeedge_num.val = value; edge_num+;/邊數/修改圖的鄰接矩陣 graph.AdjMatrix startend = graph.AdjMatrix endstart = value; DrawEdge(start,end,val);/繪制兩個端點分別為start和/end,權值為val的邊 在OnAddEdge()函數中調用了一個繪制邊的函數DrawEdge(int,int,int),三個參數分別表示新增邊的起始端點序號和權值,這里成為“起始端點”只是表述方便,實際上所建立的是無向圖。而在函數DrawEdge中,主要利用了MFC的繪圖函數Ellipse()、LineTo()、TextOut()等,具體實現細節(jié)請見源碼,這里不再贅述?!皠討B(tài)演示Kruskal算法”的響應函數為本題的核心,Kruskal算法的實現在此。這里先說明一下此按鈕的功能:用戶按下此按鈕后,將在演示區(qū)中動態(tài)的尋求最小權值的邊并用差異顏色重畫以達到突出的目的,依次找出所有的符合條件的邊后,擦除其他邊只顯示最小生成樹的各邊,具體過程如下:圖1、動態(tài)尋找過程 圖2、最終結果 下面介紹一下Kruskal算法的實現思想,因為Kruskal算法是不斷的從圖的邊中尋求權值最小的邊,所以首先對圖的所有邊按權值進行排序,這里使用快速排序,因此在CsmileGraph1Dlg中又增加了兩個成員函數partition()和qiuck_sort()來實現數組edge的排序工作。接下來就是不斷的從排好序邊中依次選取滿足條件的邊。這里滿足的【條件】是指所選邊和之前所選邊不能構成環(huán)。為此,特設置兩個標志數組visited和is_min_tree分別標記結點和邊是否已被選中。如果visitedi = visitedj或者is_min_treei,j=true說明再選取邊(i,j)即會構成環(huán),應當舍棄,繼續(xù)往下尋找,直至找出含有n的節(jié)點的n-1個最小生成樹的n-1條邊,這里需要進行n-1趟循環(huán)。3、程序實現A、圖的實現 本題采用鄰接矩陣存儲圖,定義一個Graph和Edge結構體分別保存圖的具體信息和邊信息。定義如下:struct EdgeNodeint start;/起點int end;/終點int val;/權值;struct Graphint AdjMatrix88;/鄰接矩陣char data8;/節(jié)點值int graph_vexnum;/節(jié)點數;B、排序的實現void CSmileGraph1Dlg:partition(EdgeNode *edge, int s, int t, int &cutpoint) EdgeNode tmp; tmp.start = edges.start ; tmp.end = edges.end;tmp.val = edges.val ; int i = s; int j = t; while(i<j) while(i<j&&edgej.val > edgei.val) j-; if(i<j) edgei.start = edgej.start; edgei.end = edgej.end;edgei.val = edgej.val;i+; while(i<j&&edgei.val < edgej.val) i+; if(i<j) edgej.start = edgei.start; edgej.end = edgei.end;edgej.val = edgei.val;j-; edgei.start = tmp.start; edgei.end = tmp.end;edgei.val = tmp.val;cutpoint = i; void CSmileGraph1Dlg:quick_sort(EdgeNode *edge, int s, int t)if(s<t)int i;partition(edge,s,t,i);/取得劃分點quick_sort(edge,s,i-1);/對左半部分進行快速排序quick_sort(edge,i+1,t);/對右半部分進行快速排序C、Kruskal算法的實現/把圖的邊按照權值大小排序quick_sort(edge,0,edge_num-1);int visited8 ;/標記每一條支邊的端點以判斷是否形成回路for(i=0;i<8;i+)visitedi = i;/初始化int min = INF;int min_start,min_end;/標志數組判斷某一邊是否為最小生成樹的一支bool is_min_tree88;/標記一條邊是否被選中for(min_start = 0; min_start<8 ; min_start+)for(min_end = 0; min_end<8 ; min_end+)is_min_treemin_startmin_end = is_min_treemin_endmin_start = false;/初始化 int count = 0;/Kruskal算法演示1: 排序法for(int s = 0; s < graph.graph_vexnum - 1; s+)if(count<edge_num) int m = edgecount.start; int n = edgecount.end;while(visitedm=visitedn)/找不能構成環(huán)的邊 count+; m = edgecount.start; n = edgecount.end;/如果邊不能構成環(huán),則記錄并繪制改邊if(visitedm!=visitedn&&!is_min_treemn&&!is_min_treenm) min_start = m; min_end = n; min = edgecount.val; count+; for(int k = 0; k < graph.graph_vexnum; k+)if(visitedk=visitedmin_end|visitedk=min_end)visitedk = visitedmin_start;/為選中結點做標記is_min_treemin_startmin_end = is_min_treemin_endmin_start = true;/未選中邊做標記/循環(huán)結束,找到n-1條邊4、總結 本題主要利用VC+實現Kruskal算法的動態(tài)演示,其中不斷的使用MFC的繪圖函數。對于圖的存儲,此處使用了鄰接矩陣的結構。Kruskal算法是一個經典的算法,通過此次課程設計,加深了對這一算法的理解和認識。二、計算器的實現1、分析與建模 計算器的實現是一個經典的應用,可以應用到許多知識上,如棧、二叉樹等。本題中采用棧來實現。一個數字計算器要能夠完成數學表達式的求值,而一個數學表達式包含數值和操作符兩部分,這里就需要設置兩個棧來保存數據和運算符,分別記為數據棧和操作符棧。然后通過棧的常用操作來實現表達式的求值運算。同時,要對一個數學表達式進行求值還需要規(guī)定一定的運算規(guī)則,主要是運算符的優(yōu)先級,因為這決定了表達式的計算次序。2、設計的具體思路A、界面的設計依據題目要求,需要對表達式進行求值。首先需要設計一個“窗口“讓用戶輸入表達式并輸出計算結果,因此在界面上設計一個m_result編輯框實現此功能。此外,還需要設計0-9個數字按鈕,還有+ - * / sqrt和abs幾個運算符按鈕以及左右括號外加一個=按鈕。為了能夠動態(tài)地顯示計算過程,這里又設置了一個演示區(qū)用于演示表達式的計算過程,即數據和操作符入棧和出棧的過程。另外,在界面中增加兩個按鈕分別表示作者信息和使用說明及注意事項。最后,設置clear和<-按鈕用于清空和逐個刪除輸入。具體的界面如下所示:B、輸入與輸出設計用戶通過界面上的按鈕輸入所要計算的數學表達式,而在界面的編輯框中實時地顯示出輸入表達式內容,同時用戶還可以取消所進行的操作。當用戶輸入完畢時按下=按鈕,即可產生輸出。此時的輸出分為兩步:首先在運算演示區(qū)中顯示兩個棧用以演示表達式的求解過程,求解結束后吧所得結果顯示在編輯框中。演示過程如下:演示過程演示結果C、運算規(guī)則以及異常處理 為了進行表達式的計算,首先規(guī)定運算規(guī)則及運算符的優(yōu)先級:(ABS,SQRT)>(*,/,)>(+,-)>#,同一級別的運算符按照從左到右結合。此外,規(guī)定左括號優(yōu)先級最高,可直接入棧,而遇到右括號則需要計算表達式的值直至遇到左括號。 數學表達式中的異常一般包括:除法運算時除數為0、左右括號不匹配、冪運算底數為零、開方運算底數為負;程序需要對這些異常進行處理,一般輸出提示。D、表達式的運算 對于用戶輸入的表達式采用字符數組的結構來保存,因此在CcalucatorDlg中增加變量express用于保存表達式,同時設計一個計數器count用于記錄表達式計算的進程。然后利用double result(cahr*)進行計算。函數中的參數即為表達式的字符數組,計算后返回double值。同時在函數result中用調用了CcalculatorDlg的兩個成員函數is_digit()、priority()和cal()分別用來判斷一個字符是否是數字或者小數點、定義運算符的優(yōu)先級、計算定義操作符的運算,并分別返回bool、int、double。而在函數result中主要是從字符數組的起始端開始計算直至遇到結束標志,對于不同的字符元素有不同的計算原則,如下: 如果為數字直接壓入數據棧; 如果為左括號則直接壓入運算符棧 如果遇到右括號,則不斷地對兩個棧進行運算直到遇到第一個左括號,同時彈出遇到的第一個左括號:如果遇到的是雙目運算符則連續(xù)從數據棧中取出兩個數; 如果遇到的是單目操作符則只彈出一個數據 如果運算符棧頂是左括號則無論是數據還是操作符都對應壓入數據棧和操作符棧 如果當前操作符的優(yōu)先級較高則直接壓入運算符棧 如果當前操作符的優(yōu)先級低于運算符棧頂的操作符則取出棧頂運算符進行運算直至當前運算符的優(yōu)先級高于棧頂運算符為止 遇到表達式數組中的結束標志#,進行剩余計算 另外,將用戶輸入的表達式字符數組初始化為全為#.同時,在進行計算的時候實時地利用MFC繪圖函數將數據和操作符出入棧的情形繪制出來,已達到動態(tài)演示的目的。3、程序實現 在具體的程序實現中,主要進行的是表達式求值算法的實現。因為是利用棧來進行運算,所以需要定義兩個棧分別為數據棧和操作符棧。/聲明浮點型堆棧class stack_doublepublic:stack_double();bool is_empty()const;bool is_full()const;double get_top()const;void push(const double& x);void pop();private:double dataMAX_LEN1;int top;class stack_charpublic:stack_char();bool is_empty()const;bool is_full()const;char get_top()const;void push(const char& x);void pop();private:char dataMAX_LEN1;int top;下面需要實現的是優(yōu)先級的定義和result函數的實現:/定義各運算符的優(yōu)先級int CCalculatorDlg:cal_level(char op1, char op2)if(op1=+|op1=-)if(op2=*|op2=/|op2=A|op2=S|op2=)return -1;else if(op2=#|op2=()return 1;elsereturn 0;else if(op1=*|op1=/)if(op2=+|op2=-|op2=#|op2=()return 1;else if(op2=|op2=A|op2=S)return -1;elsereturn 0;else if(op1=|op1=A|op1=S)if(op2=+|op2=-|op2=*|op2=/|op2=#|op2=()return 1;elsereturn 0;else if(op1=#)return -1;/判斷一個字符是否為數字bool CCalculatorDlg:is_digit(char ch)if(ch>=0&&ch<=9)|ch=.)return true;elsereturn false;/對不同的運算符進行運算double CCalculatorDlg:cal(double num1 , char op , double num2 )double result;switch(op)case +: result = num1+num2; break;case -: result = num1-num2; break;case *: result = num1*num2; break;case /: if(num2=0) MessageBox("分母不能為零!"); result = num1/num2; break;case : if(num1=0) MessageBox("底數不能為零!"); result = pow(num1,num2); break;case A:num1 = 0; result = abs(num2);break;case S:result = sqrt(num2); break;default: MessageBox("沒有你需要的操作符!");return result;/用字符數組存儲表達式進行計算,以#號為結束標志double CCalculatorDlg:result(char *unsolved) CPaintDC dc(this);CWnd* pWnd = GetDlgItem(IDC_DRAW);/獲得控件IDC_DRAW的窗口指針pWnd->UpdateWindow ();/避免系統(tǒng)自動更新窗口CDC* pDC = pWnd->GetDC ();/獲得所需繪圖設備環(huán)境/CBrush b(pDC->GetBkColor();/獲取原有區(qū)域背景CPen* pOldPen;CPen pNewPen(PS_SOLID,2,RGB(255,34,67);pOldPen = pDC->SelectObject (&pNewPen);CRect rcClient;pWnd->GetClientRect (rcClient);CPoint p1 = rcClient.TopLeft ();CPoint p2 = rcClient.BottomRight ();/pDC->FillRect(&rcClient,&b);/清除原有圖形int px_topleft = p1.x;int py_topleft = p1.y ;int px_bottomright = p2.x ;int py_bottomright = p2.y ;CBrush b(pDC->GetBkColor();/獲取原有區(qū)域背景pDC->FillRect(&rcClient,&b);/清除原有圖形/繪制數據棧int num_x = px_topleft+130;int num_y = py_bottomright-75; pDC->MoveTo (px_topleft+100,py_bottomright-75);pDC->LineTo (px_topleft+200,py_bottomright-75);pDC->MoveTo (px_topleft+200,py_bottomright-75);pDC->LineTo (px_topleft+200,py_topleft+100);pDC->MoveTo (px_topleft+100,py_bottomright-75); pDC->LineTo (px_topleft+100,py_topleft+100);pDC->TextOut (px_topleft+125,py_bottomright-60,"數據棧");/繪制運算符棧int op_x = px_topleft+330;int op_y = py_bottomright-75; pDC->MoveTo (px_topleft+300,py_bottomright-75);pDC->LineTo (px_topleft+400,py_bottomright-75);pDC->MoveTo (px_topleft+400,py_bottomright-75);pDC->LineTo (px_topleft+400,py_topleft+100);pDC->MoveTo (px_topleft+300,py_bottomright-75); pDC->LineTo (px_topleft+300,py_topleft+100);pDC->TextOut (px_topleft+315,py_bottomright-60,"運算符棧"); stack_double num; stack_char oper; num.push (0); pDC->TextOut (num_x,num_y-25*num_count,"0"); num_count+; Sleep(2000); oper.push (#); pDC->TextOut (op_x,op_y-25*op_count,"#"); op_count+; Sleep(2000); int i = 0; while(unsolvedi!=#) /如果為數字直接壓入數據棧 if(is_digit(unsolvedi) CString tm; tm.Empty(); int n = 0; int temp = i; while(is_digit(unsolvedi) n+; i+; for(int xx = 0; xx < n; xx+) /cxx = unsolvedtemp; tm += unsolvedtemp; temp+; /double d = change_to_double(c,n); double d = atof(tm); num.push(d); CString s; s.Format ("%0.3f",num.get_top(); pDC->TextOut (num_x,num_y-25*num_count,s); num_count+; CString tt; tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); /i+; continue; /如果為左括號則直接壓入運算符棧 else if(unsolvedi=() oper.push(); pDC->TextOut (op_x,op_y-25*op_count,"("); op_count+; pDC->TextOut(px_topleft+450,py_topleft+50,"( 入棧 "); Sleep(2000); i+; continue; /如果遇到右括號,則不斷地對兩個棧進行運算直到遇到第一個左括號,同時彈出遇到的第一個左括號 else if(unsolvedi=) while(oper.get_top()!=() char op = oper.get_top(); /如果遇到的是雙目運算符則連續(xù)從數據棧中取出兩個數 if(op!=S&&op!=A) double num1 = num.get_top(); num.pop(); CString tt; num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); tt.Empty(); tt.Format("%0.3f",num1); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); double num2 = num.get_top(); num.pop(); num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); tt.Empty(); tt.Format("%0.3f",num2); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(num2,op,num1); CString s; s.Format ("%0.3f",num.get_top (); pDC->TextOut (num_x,num_y-25*num_count,s); tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); num_count+; Sleep(2000); /如果遇到的是單目操作符則只彈出一個數據 else if(op=S|op=A) double num1 = num.get_top(); num.pop(); CString tt; num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); tt.Empty(); tt.Format("%0.3f",num1); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(0,op,num1); CString s; s.Format ("%0.3f",num.get_top (); pDC->TextOut (num_x,num_y-25*num_count,s); num_count+; tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); oper.pop(); op_count-; pDC->TextOut (op_x,op_y-25*op_count," "); CString tt; tt.Empty(); tt += op; tt += " 出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); if(oper.get_top()=#) MessageBox("括號不匹配!"); oper.pop(); op_count-; pDC->TextOut (op_x,op_y-25*op_count," "); pDC->TextOut(px_topleft+450,py_topleft+50,"( 出棧 "); Sleep(2000); i+; continue; /如果運算符棧頂是左括號則無論是數據還是操作符都對應壓入數據棧和操作符棧 else if(oper.get_top()=() if(is_digit(unsolvedi) CString tm; tm.Empty(); int n = 0; int temp = i; while(is_digit(unsolvedi) n+; i+; for(int xx = 0; xx < n; xx+) /cxx = unsolvedtemp; tm += unsolvedtemp; temp+; /double d = change_to_double(c,n); double d = atof(tm); num.push(d); CString s; s.Format("%0.3f",num.get_top (); pDC->TextOut (num_x,num_y-25*num_count,s); num_count+; CString tt; tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); /i+; continue; else oper.push(unsolvedi); pDC->TextOut (op_x,op_y-25*op_count,oper.get_top(); op_count+; CString tt; tt.Empty(); tt += oper.get_top(); tt += " 入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /如果當前操作符的優(yōu)先級較高則直接壓入運算符棧 else if(cal_level(unsolvedi,oper.get_top()>0) oper.push(unsolvedi); pDC->TextOut (op_x,op_y-25*op_count,oper.get_top(); op_count+; CString tt; tt.Empty(); tt += oper.get_top(); tt += " 入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /如果當前操作符的優(yōu)先級低于運算符棧頂的操作符則取出棧頂運算符進行運算 /直至當前運算符的優(yōu)先級高于棧頂運算符為止 else if(!(cal_level(unsolvedi,oper.get_top()>0) while(!(cal_level(unsolvedi,oper.get_top()>0) char op = oper.get_top(); if(op!=S&&op!=A) double num1 = num.get_top(); num.pop(); num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); CString tt; tt.Empty(); tt.Format("%0.3f",num1); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); double num2 = num.get_top(); num.pop(); num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); tt.Empty(); tt.Format("%0.3f",num2); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(num2,op,num1); CString s; s.Format ("%0.3f",num.get_top (); pDC->TextOut (num_x,num_y-25*num_count,s); num_count+; tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); else if(op=S|op=A) double num1 = num.get_top(); num.pop(); num_count-; pDC->TextOut (num_x,num_y-25*num_count," "); CString tt; tt.Empty(); tt.Format("%0.3f",num1); tt += "出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); num.push(cal(0,op,num1); CString s; s.Format ("%0.3f",num.get_top (); pDC->TextOut (num_x,num_y-25*num_count,s); tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += "入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); num_count+; Sleep(2000); oper.pop(); op_count-; pDC->TextOut (op_x,op_y-25*op_count," "); CString tt; tt.Empty(); tt += op; tt += " 出棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); oper.push(unsolvedi); CString tt; pDC->TextOut (op_x,op_y-25*op_count,oper.get_top (); op_count+; tt.Empty(); tt.Format("%0.3f",num.get_top(); tt += " 入棧 " pDC->TextOut(px_topleft+450,py_topleft+50,tt); Sleep(2000); i+; continue; /遇到表達式數組中的結束標志#,進行剩余計算 while(oper.get_top()!=#) char op = oper.get_top(); /雙目

注意事項

本文(數據結構課程設計報告)為本站會員(1888****888)主動上傳,裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。 若此文所含內容侵犯了您的版權或隱私,請立即通知裝配圖網(點擊聯系客服),我們立即給予刪除!

溫馨提示:如果因為網速或其他原因下載失敗請重新下載,重復下載不扣分。




關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服 - 聯系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網版權所有   聯系電話:18123376007

備案號:ICP2024067431-1 川公網安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對上載內容本身不做任何修改或編輯。若文檔所含內容侵犯了您的版權或隱私,請立即通知裝配圖網,我們立即給予刪除!