我們聽了一場關(guān)于“數(shù)據(jù)結(jié)構(gòu)報告”的演講讓我們思考了很多,平常學(xué)習(xí)工作中。很多時候我們都需要去寫一份報告,將結(jié)果整理成報告對我們來說更便于閱讀和理解,撰寫報告時我們可以從哪些角度著手?經(jīng)過閱讀本頁你的認(rèn)識會更加全面。
數(shù)據(jù)結(jié)構(gòu)報告
引言:
數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)的一個基礎(chǔ)概念,它涉及組織和管理數(shù)據(jù)的方法和原則。在計算機科學(xué)領(lǐng)域,數(shù)據(jù)結(jié)構(gòu)是一種將數(shù)據(jù)元素組織為不同形式的數(shù)據(jù)集合的方法。本報告將介紹數(shù)據(jù)結(jié)構(gòu)的重要性、主要類型、應(yīng)用領(lǐng)域以及未來的發(fā)展趨勢。
一、數(shù)據(jù)結(jié)構(gòu)的重要性:
數(shù)據(jù)結(jié)構(gòu)對于計算機科學(xué)至關(guān)重要。在計算機程序中,數(shù)據(jù)的組織和存儲方式直接影響程序的效率和可維護性。良好的數(shù)據(jù)結(jié)構(gòu)可以提供高效的數(shù)據(jù)訪問和操作,從而提高程序的執(zhí)行效率。此外,數(shù)據(jù)結(jié)構(gòu)還能夠幫助開發(fā)人員理清程序中各個數(shù)據(jù)元素之間的關(guān)系,提供良好的邏輯結(jié)構(gòu),使得程序的開發(fā)、維護和擴展更加容易。
二、主要類型:
數(shù)據(jù)結(jié)構(gòu)主要分為線性結(jié)構(gòu)、樹結(jié)構(gòu)和圖結(jié)構(gòu)三類。
1. 線性結(jié)構(gòu):包括數(shù)組、鏈表、棧和隊列等。數(shù)組是一種靜態(tài)線性結(jié)構(gòu),具有連續(xù)的存儲空間,適合隨機訪問;鏈表是一種動態(tài)線性結(jié)構(gòu),存儲空間可以動態(tài)分配,適合插入和刪除操作;棧是一種先進后出(LIFO)的線性結(jié)構(gòu);隊列是一種先進先出(FIFO)的線性結(jié)構(gòu)。
2. 樹結(jié)構(gòu):包括二叉樹、AVL樹、紅黑樹等。樹結(jié)構(gòu)由節(jié)點和邊組成,每個節(jié)點可以有多個子節(jié)點。二叉樹是一種特殊的樹結(jié)構(gòu),每個節(jié)點最多只有兩個子節(jié)點。
3. 圖結(jié)構(gòu):由節(jié)點和邊組成,節(jié)點之間可以有多條邊相連。圖結(jié)構(gòu)可以分為有向圖和無向圖,有向圖中的邊有方向,無向圖中的邊沒有方向。
三、數(shù)據(jù)結(jié)構(gòu)的應(yīng)用領(lǐng)域:
數(shù)據(jù)結(jié)構(gòu)在計算機科學(xué)的各個領(lǐng)域都有廣泛應(yīng)用。
1. 數(shù)據(jù)庫系統(tǒng):數(shù)據(jù)結(jié)構(gòu)用于組織和管理數(shù)據(jù)庫中的數(shù)據(jù),包括數(shù)據(jù)表、索引、視圖等。
2. 算法設(shè)計和分析:數(shù)據(jù)結(jié)構(gòu)是設(shè)計和實現(xiàn)高效算法的基礎(chǔ),不同的數(shù)據(jù)結(jié)構(gòu)適用于不同的算法問題。
3. 操作系統(tǒng):數(shù)據(jù)結(jié)構(gòu)用于管理操作系統(tǒng)中的進程、文件系統(tǒng)和內(nèi)存等。
4. 網(wǎng)絡(luò)和圖像處理:數(shù)據(jù)結(jié)構(gòu)可以用于網(wǎng)絡(luò)路由算法和圖像壓縮等應(yīng)用。
5. 人工智能:數(shù)據(jù)結(jié)構(gòu)在機器學(xué)習(xí)和深度學(xué)習(xí)等領(lǐng)域有重要作用。
四、數(shù)據(jù)結(jié)構(gòu)的發(fā)展趨勢:
隨著計算機科學(xué)的不斷發(fā)展,數(shù)據(jù)結(jié)構(gòu)也在不斷演進和創(chuàng)新。
1. 高性能數(shù)據(jù)結(jié)構(gòu):為了提高程序的執(zhí)行效率,研究人員致力于設(shè)計高性能的數(shù)據(jù)結(jié)構(gòu),如哈希表、跳表等。
2. 大數(shù)據(jù)處理:隨著大數(shù)據(jù)時代的到來,數(shù)據(jù)結(jié)構(gòu)需要能夠處理海量的數(shù)據(jù),如分布式哈希表、B樹等。
3. 數(shù)據(jù)隱私與安全:在數(shù)據(jù)共享和隱私保護中,數(shù)據(jù)結(jié)構(gòu)需要具備安全性,如保護數(shù)據(jù)的隱私和防止數(shù)據(jù)泄露。
4. 學(xué)科交叉融合:數(shù)據(jù)結(jié)構(gòu)與其他學(xué)科的交叉融合也是未來的發(fā)展方向,如數(shù)據(jù)結(jié)構(gòu)與人工智能、數(shù)據(jù)結(jié)構(gòu)與生物學(xué)等領(lǐng)域的結(jié)合。
結(jié)論:
數(shù)據(jù)結(jié)構(gòu)作為計算機科學(xué)的基礎(chǔ)概念,對于程序的性能和可維護性至關(guān)重要。通過良好的數(shù)據(jù)結(jié)構(gòu)設(shè)計,我們可以提高程序的效率,并且使得程序的開發(fā)、維護和擴展更加容易。隨著計算機科學(xué)的發(fā)展,數(shù)據(jù)結(jié)構(gòu)也在不斷演變和創(chuàng)新,滿足不同應(yīng)用領(lǐng)域和需求。因此,深入理解和掌握數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用是每一個計算機科學(xué)從業(yè)者所必備的基本素質(zhì)。
問題描述:;四則運算表達(dá)式求值,將四則運算表達(dá)式用中綴表達(dá)式;一、需求分析:;輸入輸出格式:;輸入格式:在字符界面上輸入一個中綴表達(dá)式,回車表;請輸入表達(dá)式:;輸入一個中綴表達(dá)式;輸出格式:如果該中綴表達(dá)式正確,那么在字符界面上;式,其中后綴表達(dá)式中兩相鄰操作數(shù)之間利用空格隔開;果不正確,在字符界面上輸出
問題描述:
四則運算表達(dá)式求值,將四則運算表達(dá)式用中綴表達(dá)式,然后轉(zhuǎn)換為后綴表達(dá)式,并計算結(jié)果。
一、 需求分析:
1、本程序是利用二叉樹后序遍歷來實現(xiàn)表達(dá)式的轉(zhuǎn)換,同時可以使用實驗三的結(jié)果來求解后綴表達(dá)式的值。
2、輸入輸出格式:
輸入格式:在字符界面上輸入一個中綴表達(dá)式,回車表示結(jié)束。
請輸入表達(dá)式:
輸入一個中綴表達(dá)式
輸出格式:如果該中綴表達(dá)式正確,那么在字符界面上輸出其后綴表達(dá)
式,其中后綴表達(dá)式中兩相鄰操作數(shù)之間利用空格隔開;如
果不正確,在字符界面上輸出表達(dá)式錯誤提示。
逆波蘭表達(dá)式為:
3、測試用例
輸入:21+23*(12-6)
輸出:21 23 12 6 -*+ 輸出逆波蘭表達(dá)式 運算結(jié)果為:輸出運算后的結(jié)果
二、概要設(shè)計 :
抽象數(shù)據(jù)類型
二叉樹類BiTree
算法的基本思想
根據(jù)題目要求,利用棧計算,和二叉樹存儲,來計算表達(dá)式
該算法的基本思想是:
先利用棧進行計算,然后用二叉樹進行存儲,和實驗三算法一樣來計算逆波蘭表達(dá)式的值
程序的流程
程序由三個模塊組成:
(1) 輸入模塊:輸入一個運算式
(2) 計算模塊:利用棧進行表達(dá)式的計算,二叉樹來存儲。 (3 ) 輸出模塊:屏幕上顯示出后綴表達(dá)式和運算結(jié)果。
三、詳細(xì)設(shè)計
物理數(shù)據(jù)類型
程序含有兩個類,其中棧不再贅述,另一個類為二叉樹class BiTree包含私有成員struct BiTreeNode,根節(jié)點BiTreeNode *T;索引index; int number_of_point 優(yōu)先級比較函數(shù) compare(char a,char b);生成樹的函數(shù)void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判斷數(shù)字函數(shù)bool IsNumber(char a);求值函數(shù)double Operate(BiTreeNode *T);還有顯示后綴表達(dá)式的函數(shù)void display(BiTreeNode *T) ;而公有成員函數(shù)則是對私有函數(shù)的重載,為方便使用,因為函數(shù)中普遍使用了遞歸的算法。
算法的時空分析
此算法利用棧和二叉樹來實現(xiàn),故次算法的的時間復(fù)雜度為(N)。
輸入和輸出的格式
輸入格式:請輸入表達(dá)式:
輸入一個中綴表達(dá)式 //回車
輸出格式:逆波蘭表達(dá)式為:
輸出逆波蘭表達(dá)式
運算結(jié)果為:輸出運算后的結(jié)果
四、調(diào)試分析
略。
五、測試結(jié)果
本實驗的測試結(jié)果截圖如下:
六、用戶使用說明(可選)
運行程序時
提示輸入表達(dá)式
本程序可以將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式后在計算出運算式的結(jié)果。 提示:請輸入表達(dá)式:
輸出
提示:逆波蘭表達(dá)式為:
運算結(jié)果:
七、實驗心得(可選)
本次實驗過程比較復(fù)雜,由于書上的`知識掌握的還不是很牢靠,所以現(xiàn)在實驗做起來有點兒吃力。本實驗主要是通過與同學(xué)的討論和課后查閱資料來完成的,雖然有些地方還不是很懂,但基本上能完成此次實驗的內(nèi)容。而且通過本次實驗,加深了對二叉樹算法的了解。
附錄(實驗代碼):
#include
#include
#include
#include
#include
#include
#define STACK_INIT_SIZE 100
#define DATA_SIZE 10
#define STACKINCREMENT 10
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef float SElemtype;
typedef int Status;
typedef char * TElemType;
typedef struct BiTNode {
TElemType data;
int len; //data字符串中字符的個數(shù)
struct BiTNode * lchild, * rchild;
}BiTNode, *BiTree;
typedef struct
{
SElemtype *base;
SElemtype *top;
int stacksize;
} SqStack;
Status IsDigital(char ch)
{ if(ch>='0'&&ch
{return 1; //是數(shù)字字母
}
return 0; //不是數(shù)字字母
}
int CrtNode(stack &PTR, char *c)
{
BiTNode * T;
int i=0;
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = (char *)malloc(DATA_SIZE*sizeof(char));
while(IsDigital(c[i]))
{T->data [i] = c[i];
i++; }
T->len = i;
T->lchild = T->rchild = NULL;
PTR.push (T);
return i;
}
void CrtSubTree(stack &PTR, char c)
{BiTNode * T;
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = (char *)malloc(DATA_SIZE*sizeof(char));
T->data [0] = c;
T->len = 1;
T->rchild = (); //先右子樹,否則運算次序反了
PTR.pop ();
T->lchild = ();
PTR.pop ();
PTR.push (T);
}
char symbol[5][5]={{'>', '>', ''}, //符號優(yōu)先級
{'>', '>', ''},
{'>', '>', '>', '>', '>'},
{'>', '>', '>', '>', '>'},
{'
int sym2num(char s) //返回符號對應(yīng)優(yōu)先級矩陣位置 { switch(s)
{
case '+': return 0; break;
case '-': return 1; break;
case '*': return 2; break;
case '/': return 3; break;
case '#': return 4; break;
}
}
char Precede(char a, char b) //返回符號優(yōu)先級
{return(symbol[sym2num(a)][sym2num(b)]);}
void CrtExptree(BiTree &T, char exp[])
{ //根據(jù)字符串exp的內(nèi)容構(gòu)建表達(dá)式樹T
stack PTR;//存放表達(dá)式樹中的節(jié)點指針
stack OPTR;//存放操作符
char op;
int i=0;
OPTR.push ('#');
op = ();
while( !((exp[i]=='#') && (()=='#')) ) //與
{
if (IsDigital(exp[i]))
{//建立葉子節(jié)點并入棧 PTR
i+=CrtNode(PTR, &exp[i]);
}
else if (exp[i] == ' ')
i++;
else{
switch (exp[i])
{
case '(': {
OPTR.push (exp[i]);
i++;
break;}
case ')': {
op = (); OPTR.pop ();
while(op!='('){
CrtSubTree(PTR, op);
op = (); OPTR.pop ();
設(shè)計題目:模擬計算器程序
學(xué)生姓名:謝先斌
系 別:計算機與通信工程學(xué)院
專 業(yè):計算機科學(xué)與技術(shù)
班 級:1班
學(xué) 號:541007010144
指導(dǎo)教師:盧冰 李曄
2012 年 6 月 21 日
鄭州輕工業(yè)學(xué)院
課 程 設(shè) 計 任 務(wù) 書
題目 模擬計算器程序
專業(yè)、班級 計算機科學(xué)與技術(shù)10-01班 學(xué)號 541007010144 姓名 謝先斌
主要內(nèi)容:
設(shè)計一個模擬計算器的程序,要求能對包含加、減、乘、除、括號運算符及SQR和ABS函數(shù)的任意整型表達(dá)式進行求解。
基本要求:
要檢查有關(guān)運算的條件,并對錯誤的條件產(chǎn)生報警。
主要參考資料:
[第52頁3.2.5表達(dá)式求值
完 成 期 限: 2012年6月21日
指導(dǎo)教師簽名:
課程負(fù)責(zé)人簽名:
2012年 6月 21 日
一、 設(shè)計題目
模擬計算器的程序
設(shè)計一個模擬計算器的程序,要求能對包含加、減、乘、除、括號運算符及SQR和ABS函數(shù)的任意整型表達(dá)式進行求解。
設(shè)計要求:要檢查有關(guān)運算的條件,并對錯誤的條件產(chǎn)生報警。
二、 算法設(shè)計的思想
本程序設(shè)計主要是應(yīng)用了棧,利用棧的“先進后出”原理,建立了兩個棧,分別為運算符棧pOStack和運算數(shù)棧pDStack。算法的基本思想(參考課本p53頁)是:
(1) 首先置操作數(shù)棧為pDStack空棧,表達(dá)式起始符為“=”,位運算符棧的棧底元素;
(2) 依次讀入表達(dá)式中的每個字符,若是操作數(shù)則進入pDStack棧,若是運算符則和pOStack棧的棧定運算符比較優(yōu)先權(quán)后作相應(yīng)操作,直到整個表達(dá)式求值完畢(即pOStack棧的棧定元素和當(dāng)前讀入的字符均為“=” )。
三、 算法的流程圖
本程序的流程如下附圖1所示:
附圖1 程序流程圖
四、 算法設(shè)計分析
首先創(chuàng)建了兩個棧:
typedef struct OPStack //定義運算符棧
{
char opStack[MAX_OPERATOR_NUM];
int top;
}OPStack, *pOPStack;
typedef struct DATAStack //定義運算數(shù)棧
{
double stack[MAX_DATA_NUM];
int top;
}DATAStack, *pDATAStack;
來分別存放運算符和運算數(shù)。在兩個結(jié)構(gòu)體中均有一個top數(shù)據(jù)域,當(dāng)top=-1時,表示該站為空棧。
定義一個Evaluateexpression_r()函數(shù)來完成函數(shù)運算的主要功能:讀入表達(dá)式,并計算結(jié)果。以下是對該函數(shù)的分析:
當(dāng)一次運算開始時,分別調(diào)用InitpOPStack(pOPStack &pOStack)函數(shù)和InitpDATAStack(pDATAStack &pDStack)函數(shù)分別對運算符棧和運算數(shù)棧進行初始化。調(diào)用PushOPStack(pOStack, '=')函數(shù)來完成運算符棧棧低元素的設(shè)置。
通過PushOPStack(pOPStack &pOStack, char ch)函數(shù)、
PopOPStack(pOPStack &pOStack, char &ch)函數(shù)、
PushDATAStack(pDATAStack &pDStack, double d)函數(shù)和PopDATAStack(pDATAStack &pDStack, double &d)函數(shù)來分別完成運算符和運輸數(shù)的進出棧操作。getToppOPStack(pOPStack &pOStack)函數(shù)和getToppDATAStack(pDATAStack &pDStack) 函數(shù)主要是進行得到棧定元素的作用,特別是在對運算符棧優(yōu)先級的比較中十分重要,其中還會調(diào)用IsOP(char &ch) 函數(shù)來區(qū)分讀入的是運算符還是運算數(shù)。
ChangeChar(char &c)函數(shù)當(dāng)每次讀入一個字符是都會調(diào)用一次,主要的作用就是完成不用區(qū)分A、S的大小的功能。
Precede(char op>、=”結(jié)果來進行下一步的操作:''表示運算符和運算數(shù)各退棧一次并調(diào)用Operate(double a, char theta, double b)函數(shù)(主要是對出棧的運算符和運算數(shù)進行計算),最后將運算結(jié)果壓入運算數(shù)棧pDStack。
當(dāng)操作結(jié)束時運算數(shù)棧的棧頂元素就是計算結(jié)果,分別調(diào)用ClearpOPStack(pOStack)函數(shù)清空運算符棧、ClearpDATAStack(pDStack)函數(shù)清空運算數(shù)棧以待下一次繼續(xù)進行相關(guān)操作。
print_user()函數(shù)和exit_E()函數(shù)開始和結(jié)束時個調(diào)用一次,分別完成歡迎界面和退出界面的布置。main()是本程序的主函數(shù),主要通過while語句和switch語句來完成本程序的運行,當(dāng)輸入Y(y)時調(diào)用Evaluateexpression_r()函數(shù)完成計算,當(dāng)輸入N(n)時,調(diào)用exit_E()函數(shù)退出本程序的運行。
本程序還考慮到各種異常的處理,如運算時除數(shù)為0、被開方數(shù)為0等情況的出現(xiàn),最終的處理是直接退出程序的運行。
五、 運行結(jié)果分析
1. 程序開始界面,如附圖2:
附圖2 開始界面
2.如下附圖3,附圖4分別是選擇進入和退出程序界面:
附圖3(在以下界面輸入計算式即可運行出計算結(jié)果如附圖5)
附圖4 退出界面
附圖5 運行界面
2. 對異常的處理
a) 對異常1除數(shù)為0,如輸入“1+2/0=”程序?qū)⒅苯油顺觯绺綀D6:
附圖6 異常1除數(shù)為0
b) 對異常2被開方數(shù)為負(fù)數(shù),如輸入“3+S(-9)=”程序?qū)⒅苯油顺?,如附圖7:
附圖7 異常2被開方數(shù)為負(fù)數(shù)
3.以下是對各種簡單運算的運行結(jié)果,如附圖8:
附圖8 簡單運算
3. 綜合運算:如式子“1/2+A(7-8)-S(9*8)=”運行結(jié)果如附圖9
附圖9 綜合運算
六、 收獲及體會
本程序以C語言的棧的相關(guān)知識為基礎(chǔ),通過控制兩個棧(運算數(shù)棧和運算符棧)的進出的棧操作,來實現(xiàn)對包含加、減、乘、除、括號運算符及SQRT和ABS函數(shù)的任意整型表達(dá)式的求解運算。
從程序的編寫來看,感覺這次自己真的學(xué)到了好多,特別是對程序的開發(fā)流程。從最初的選定程序,到最終的程序運行成功,讓我感到如果是僅僅掌握課本上的知識是遠(yuǎn)遠(yuǎn)不能夠很好的應(yīng)用到實際的編程中去的。在這個過程中還需要我們更多的去考慮到實際條件的種種限制和約束。
我在寫本程序的過程中也遇到了很多的問題,當(dāng)然本程序的.核心問題就是對兩個棧的壓出棧操作,需要做優(yōu)先級判斷,并要考慮什么時候進棧,什么時候出棧等操作。我采用了課本上第()AS=”共被開方數(shù)小于N、A、S等字符也進行了改進,最終本程序可以不區(qū)分大小寫就完成相關(guān)操作。
總之,經(jīng)過本次專業(yè)課程設(shè)計,讓我掌握了開發(fā)應(yīng)用軟件的基本流程,運用所學(xué)編程技能的基本技巧,也讓我初步了解了軟件設(shè)計的基本方法,提高進行工程設(shè)計的基本技能及分析、解決實際問題的能力,為以后畢業(yè)設(shè)計和工程實踐等打下良好的基礎(chǔ)。相信通過這次的課程設(shè)計,我對所學(xué)的《數(shù)據(jù)結(jié)構(gòu)(C語言版)》和各種編程語言都有了一個全新的認(rèn)識。我也會積極吸取本次課程設(shè)計的經(jīng)驗,繼續(xù)研究數(shù)據(jù)結(jié)構(gòu)和所學(xué)的各種編程語言。
七、 源代碼
# include
# include
# include
# include
# define MAX_OPERATOR_NUM 100 //運算符棧數(shù)組長度
# define MAX_DATA_NUM 100 //運算數(shù)棧數(shù)組長度
typedef struct OPStack //定義運算符棧
{
char opStack[MAX_OPERATOR_NUM];
int top;
}OPStack, *pOPStack;
typedef struct DATAStack //定義運算數(shù)棧
{
double stack[MAX_DATA_NUM];
int top;
}DATAStack, *pDATAStack;
void InitpOPStack(pOPStack &pOStack) //初始化運算符棧
{
if( !(pOStack = (pOPStack)malloc(sizeof(OPStack)))) //為運算符棧分配空間
{
printf("分配內(nèi)存空間失敗! ");
exit(-1);
}
pOStack->top = -1;
}
void InitpDATAStack(pDATAStack &pDStack) //初始化運算數(shù)棧
{
if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack)))) //為運算數(shù)棧分配空間
{
printf("分配內(nèi)存空間失敗! ");
exit(-1);
}
pDStack->top = -1;
}
void PushOPStack(pOPStack &pOStack, char ch) //運算符進棧
{
pOStack->opStack[++(pOStack->top)] = ch;
}
void PopOPStack(pOPStack &pOStack, char &ch) //運算符出棧
{
ch = pOStack->opStack[pOStack->top];
pOStack->top--;
}
void PushDATAStack(pDATAStack &pDStack, double d) //運算數(shù)進棧
{
++(pDStack->top);
pDStack->stack[pDStack->top] = d;
}
void PopDATAStack(pDATAStack &pDStack, double &d) //運算數(shù)出棧
{
d = pDStack->stack[pDStack->top];
pDStack->top--;
}
void ClearpOPStack(pOPStack &pOStack) //清空運算符棧
{
pOStack->top = -1;
}
void ClearpDATAStack(pDATAStack &pDStack) //清空運算數(shù)棧
{
pDStack->top = -1;
}
char GetToppOPStack(pOPStack &pOStack) //獲取運算符棧頂元素
{
return pOStack->opStack[pOStack->top];
}
double GetToppDATAStack(pDATAStack &pDStack) //獲取運算數(shù)棧頂元素
{
return pDStack->stack[pDStack->top];
}
bool IsOP(char &ch) //區(qū)分 運算符 和 運算數(shù) 的函數(shù),是運算符時返回true,否則返回false
{ //判斷是否為符號
if ( (ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '=') || (ch == 'A') || (ch == 'S') || (ch == 'a') || (ch == 's') || (ch == '(') || (ch == ')') )
return true;
else
return false;
}
char Precede(char op1, char op2) //參考《數(shù)據(jù)結(jié)構(gòu)》(C語言版)第53頁 3.2.5表達(dá)式求值 表 3.1
{
char tab[9][10]; //定義字符串的二維數(shù)組來存放運算符優(yōu)先級的關(guān)系
strcpy( tab[0], ">>" );
strcpy( tab[1], ">>" );
strcpy( tab[2], ">>>>" );
strcpy( tab[3], ">>>>" );
strcpy( tab[4], "
strcpy( tab[5], ">>>>E>>>>" );
strcpy( tab[6], ">>>>>>>" );
strcpy( tab[7], ">>>>>>>" );
strcpy( tab[8], "
printf(" | ***歡迎您的下次使用!謝謝!!!*** | "); //退出使用
printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ");
}
double Operate(double a, char theta, double b) //對出棧的運算符和運算數(shù)進行計算
{
double s;
switch(theta)
{
case '+':
s = a + b;
break;
case '-':
s = a - b;
break;
case '*':
s = a * b;
break;
case '/':
if ( b != 0 ) //判斷除數(shù)是否為0,若為0,退出程序
{
s = a/b;
break;
}
else
{
printf(" #### 除數(shù)為0,非法運算。程序終止! #### ");
exit_E(); //打印結(jié)束菜單
exit(-1);
}
case 'A':
s = fabs(b); //調(diào)用FABS()函數(shù)
break;
case 'S':
if( b >= 0) //判斷被開方數(shù)是否為0,若為0,退出程序
{
s = sqrt(b); //調(diào)用SQRT()函數(shù)
break;
}
else
{
printf(" #### 求負(fù)數(shù)的平方根是非法運算。程序終止! #### ");
exit_E(); //打印結(jié)束菜單
exit(-1);
}
}
return s;
}
char ChangeChar(char &c) //通過ChangeChar函數(shù)來把a、s的小寫字母改為大寫的
{
if( c == 'a' )
c = 'A';
else if( c == 's' )
c = 'S';
return c;
}
//參考《數(shù)據(jù)結(jié)構(gòu)》(C語言版)第53頁 3.2.5表達(dá)式求值算法3.4 Evaluateexpression_r()函數(shù)
void Evaluateexpression_r() //計算函數(shù):讀入表達(dá)式,并計算結(jié)果
{
pOPStack pOStack; //聲明運算符棧
pDATAStack pDStack; //聲明運算數(shù)棧
double result; //存運算的結(jié)果
char x, theta, c; //c存放讀取的字符,x、theta存放運算符棧的棧頂元素
int flag, data; //標(biāo)識符,用來讀入連續(xù)的數(shù)字
double s;
double getd; //存放GetTop***的結(jié)果
double a, b, cc; //a,b存放數(shù)據(jù)棧出棧的棧頂元素, c存放運算結(jié)果
flag = 0; //初始化標(biāo)識符,用來判斷字符串中的連續(xù)數(shù)字
data = 0; //
InitpOPStack(pOStack); //初始化運算符棧
InitpDATAStack(pDStack); //初始化運算數(shù)棧
PushOPStack(pOStack, '='); //在運算符棧底放入'='
printf(" &請輸入表達(dá)式以'='結(jié)束:");
c = get); //讀入字符
ChangeChar(c); //通過調(diào)用函數(shù)來實現(xiàn)把小寫的a、s改為大寫的A、S
while( c != '=' || GetToppOPStack(pOStack) != '=')
{
if( !IsOP(c) ) //不是運算符進棧
{
s = c - '0'; //把字符轉(zhuǎn)化為數(shù)字
if ( flag == 1 )
{
PopDATAStack(pDStack, getd);
s = getd*10 + s;
}
PushDATAStack(pDStack, s);
flag = 1;
c = get);
ChangeChar(c);
}
else
{
flag = 0;
switch( Precede(GetToppOPStack(pOStack), c) ) //輸入元素和運算符棧頂元素比較
{
case '
PushOPStack(pOStack, c);
c = get);
ChangeChar(c);
break;
case '=': //托括號并接受下一個字符
PopOPStack(pOStack, x);
c = get);
ChangeChar(c);
break;
case '>': //退棧并將運算結(jié)果進棧
PopOPStack(pOStack, theta);
PopDATAStack(pDStack, b);
PopDATAStack(pDStack, a);
cc = Operate(a, theta, b);
PushDATAStack(pDStack, cc);
break;
}//switch
}//else
}//while
result = GetToppDATAStack(pDStack); //運算結(jié)束時,運算數(shù)棧的棧底元素就是計算結(jié)果
ClearpOPStack(pOStack); //清空運算符棧
ClearpDATAStack(pDStack); //清空運算數(shù)棧
printf(" ->計算結(jié)果為:%.2f ", result); //輸出運算結(jié)果
return ;
}
void print_user() //歡迎界面
{
printf(" 歡迎使用C語言版模擬計算器 ");
printf("************************************************************************ ");
printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ");
printf(" | 模擬計算器使用說明 | ");
printf(" | 作者:謝先斌 | ");
printf(" | 本程序包括對'+'、'-'、'*'、'/'、'()'的運算 | ");
printf(" | 本程序中ABS()算用A()替代、SQRT()運算用S()代替 | ");
printf(" | 本程序中的一切字母均不區(qū)分大小寫 | ");
printf(" 正確的表達(dá)式如:1+A(7-8)+S(9*8)= ");
printf(" | 輸入'='表示表達(dá)式輸入結(jié)束!! | ");
printf(" | 歡迎使用!!!-->--> | ");
printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ");
printf("************************************************************************ ");
}
int main() //主函數(shù)
{
char in;
bool b; //標(biāo)識符,用來標(biāo)識是否結(jié)束程序
b = true; //初始化,不結(jié)束
print_user(); //打印歡迎界面
printf(" *請確認(rèn)使用計算器Y/N:");
while(1)
{
scanf("%c", &in); //確認(rèn)是否繼續(xù)操作
get); //吃掉會車,避免干擾
switch(in)
{
case 'Y':
case 'y':
{
Evaluateexpression_r(); //進入計算函數(shù):讀入表達(dá)式,并計算結(jié)果
break;
}
case 'N':
case 'n':
{
exit_E();
b = false;
break;
}
//default:
// printf(" **輸入錯誤,請重新輸入Y/N:");
// break;
}
if(b==false) //如果 b==false ,退出整個程序
break;
printf(" *您確定要繼續(xù)使用計算機Y/N:");
get); //用getchar吃掉回車,避免對后續(xù)輸入中in的干擾
}
一、實驗?zāi)康募耙?/strong>
1)掌握棧和隊列這兩種特殊的線性表,熟悉它們的特性,在實際問題背景下靈活運用它們。
本實驗訓(xùn)練的要點是“?!焙汀瓣犃小钡挠^點;
二、實驗內(nèi)容
1) 利用棧,實現(xiàn)數(shù)制轉(zhuǎn)換。
2) 利用棧,實現(xiàn)任一個表達(dá)式中的語法檢查(選做)。
判隊列空、入隊列、出隊列);
三、實驗流程、操作步驟或核心代碼、算法片段
順序棧:
Status InitStack(SqStack &S)
{
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S.base)
return ERROR;
=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestoryStack(SqStack &S)
{
free(S.base);
return OK;
}
Status ClearStack(SqStack &S)
{
=S.base;
return OK;
}
Status StackEmpty(SqStack S)
{
if(S.base==)
return OK;
return ERROR;
}
int StackLength(SqStack S)
{
return -S.base;
}
Status GetTop(SqStack S,ElemType &e)
{
if(-S.base>=S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base) return ERROR;
=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*++=e;
return OK;
}
Status Push(SqStack &S,ElemType e)
{
if(-S.base>=S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base)
return ERROR;
=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*++=e;
return OK;
}
Status Pop(SqStack &S,ElemType &e)
{
if(==S.base)
return ERROR;
e=*--;
return OK;
}
Status StackTraverse(SqStack S)
{
ElemType *p;
p=(ElemType *)malloc(sizeof(ElemType));
if(!p) return ERROR;
p=;
while(p!=S.base)//上面一個...
{
p--;
printf("%d ",*p);
}
return OK;
}
Status Compare(SqStack &S)
{
int flag,TURE=OK,FALSE=ERROR;
ElemType e,x;
InitStack(S);
flag=OK;
printf("請輸入要進?;虺鰲5脑兀?);
while((x= getchar)!='#'&&flag)
{
switch (x)
{
case '(':
case '[':
case '{':
if(Push(S,x)==OK)
printf("括號匹配成功! ");
break;
case ')':
if(Pop(S,e)==ERROR || e!='(')
{
printf("沒有滿足條件 ");
flag=FALSE;
}
break;
case ']':
if ( Pop(S,e)==ERROR || e!='[')
flag=FALSE;
break;
case '}':
if ( Pop(S,e)==ERROR || e!='{')
flag=FALSE;
break;
}
}
if (flag && x=='#' && StackEmpty(S))
return OK;
else
return ERROR;
}
鏈隊列:
Status InitQueue(LinkQueue &Q)
{
Q.front =Q.rear=
(QueuePtr)malloc(sizeof(QNode));
if (!Q.front) return ERROR;
Q.front->next = NULL;
return OK;
}
Status DestoryQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
Status QueueEmpty(LinkQueue &Q)
{
if(Q.front->next==NULL)
return OK;
return ERROR;
}
Status QueueLength(LinkQueue Q)
{
int i=0;
QueuePtr p,q;
p=Q.front;
while(p->next)
{
i++;
p=Q.front;
q=p->next;
p=q;
}
return i;
}
Status GetHead(LinkQueue Q,ElemType &e)
{
QueuePtr p;
p=Q.front->next;
if(!p)
return ERROR;
e=p->data;
return e;
}
Status ClearQueue(LinkQueue &Q)
{
QueuePtr p;
while(Q.front->next )
{
p=Q.front->next;
free(Q.front);
Q.front=p;
}
Q.front->next=NULL;
Q.rear->next=NULL;
return OK;
}
Status EnQueue(LinkQueue &Q,ElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof (QNode));
if(!p)
return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next = p;
Q.rear=p; //p->next 為空
return OK;
}
Status DeQueue(LinkQueue &Q,ElemType &e)
{
QueuePtr p;
if (Q.front == Q.rear)
return ERROR;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p)
Q.rear = Q.front; //只有一個元素時(不存在指向尾指針)
free (p);
return OK;
}
Status QueueTraverse(LinkQueue Q)
{
QueuePtr p,q;
if( QueueEmpty(Q)==OK)
{
printf("這是一個空隊列! ");
return ERROR;
}
p=Q.front->next;
while(p)
{
q=p;
printf("%ddata);
q=p->next;
p=q;
}
return OK;
}
循環(huán)隊列:
Status InitQueue(SqQueue &Q)
{
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
exit(OWERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear)
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
int QueueLength(SqQueue Q)
{
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status DestoryQueue(SqQueue &Q)
{
free(Q.base);
return OK;
}
Status QueueEmpty(SqQueue Q) //判空
{
if(Q.front ==Q.rear)
return OK;
return ERROR;
}
Status QueueTraverse(SqQueue Q)
{
if(Q.front==Q.rear)
printf("這是一個空隊列!");
while(Q.front%MAXQSIZE!=Q.rear)
{
printf("%d
Q.front++;
}
return OK;
}
一、實驗?zāi)康?/p>
數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)與技術(shù)中非常重要的一門課程,它研究的是各種各樣的數(shù)據(jù)以及它們在計算機中的存儲和操作方式。本次實驗旨在通過對不同數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)與應(yīng)用,進一步理解和掌握各種數(shù)據(jù)結(jié)構(gòu)的特點、運算和算法。
二、實驗背景
數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)的重要基石之一,它可以幫助有效地組織和管理數(shù)據(jù)。實驗課程的目的是通過實際操作來加深對數(shù)據(jù)結(jié)構(gòu)的理解,鍛煉的編程技能以及分析和解決實際問題的能力。
三、實驗過程
1. 實驗環(huán)境的準(zhǔn)備
本次實驗使用的編程語言是C++,需要首先配置好編程環(huán)境,安裝好相關(guān)的開發(fā)工具和庫文件。
2. 實驗數(shù)據(jù)的準(zhǔn)備
在實驗開始前,需要準(zhǔn)備好不同的數(shù)據(jù)集,這些數(shù)據(jù)集可以包括不同類型的數(shù)據(jù),例如整數(shù)、字符串等??梢詮奈募凶x取數(shù)據(jù),或者手動輸入數(shù)據(jù)。
3. 實驗數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)
根據(jù)實驗要求,需要實現(xiàn)多個數(shù)據(jù)結(jié)構(gòu),例如鏈表、棧、隊列、二叉樹等。在實現(xiàn)過程中,需要考慮數(shù)據(jù)結(jié)構(gòu)的初始化、增刪改查等基本操作,并且保證數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定性和高效性。
4. 實驗算法的設(shè)計與應(yīng)用
在實驗過程中,需要設(shè)計和實現(xiàn)與數(shù)據(jù)結(jié)構(gòu)相關(guān)的算法。例如,在鏈表中查找指定元素、在二叉樹中進行遍歷等。這些算法可以通過遞歸、循環(huán)等方式實現(xiàn),需要根據(jù)具體問題來選擇最優(yōu)解。
5. 實驗數(shù)據(jù)的測試與分析
實現(xiàn)完成后,需要針對不同的數(shù)據(jù)結(jié)構(gòu)和算法進行測試。通過不同規(guī)模和類型的數(shù)據(jù)進行性能測試,分析不同數(shù)據(jù)結(jié)構(gòu)和算法的運行效率和空間復(fù)雜度。并且對實驗結(jié)果進行詳細(xì)的分析和總結(jié)。
四、實驗結(jié)果與分析
在本次實驗中,基于C++語言實現(xiàn)了鏈表、棧、隊列、二叉樹等數(shù)據(jù)結(jié)構(gòu),并設(shè)計了相關(guān)的算法進行測試。通過實驗數(shù)據(jù)的測試與分析,得出了以下:
1. 在數(shù)據(jù)規(guī)模較小的情況下,各個數(shù)據(jù)結(jié)構(gòu)的性能相差不大,但隨著數(shù)據(jù)規(guī)模的增大,鏈表和隊列的性能表現(xiàn)更好。
2. 在需要頻繁插入和刪除數(shù)據(jù)的場景中,鏈表和隊列的效率明顯高于其他數(shù)據(jù)結(jié)構(gòu)。
3. 在需要高效搜索和排序的場景中,二叉樹的性能最好,具有較快的搜索速度和高效的排序能力。
五、實驗總結(jié)
通過本次實驗,加深了對數(shù)據(jù)結(jié)構(gòu)的理解和應(yīng)用,熟練掌握了常見數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)和算法設(shè)計。同時,也發(fā)現(xiàn)了不同數(shù)據(jù)結(jié)構(gòu)在不同場景下的優(yōu)勢和劣勢,這將對日后的程序設(shè)計和問題解決有著重要的指導(dǎo)作用。
本次實驗不僅幫助深入了解了數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用,還提高了的編程技巧和問題解決能力。實驗過程中的一系列操作和思考,都是今后從事軟件開發(fā)和算法設(shè)計必不可少的經(jīng)驗。
實驗報告;課程名稱:數(shù)據(jù)結(jié)構(gòu)班級:軟件工程實驗成績:;實驗?zāi)康?對隊列的理解;對STL中的queue的使用;實驗仿真一個網(wǎng)絡(luò)打印過程;二、實驗內(nèi)容與實驗步驟流程圖;這個任務(wù)隊列的測試使用STL隊列適配器;具體地說,每一行中包含的信息是
實 驗 報 告
課程名稱:數(shù)據(jù)結(jié)構(gòu) 班級:軟件工程實驗成績:
1206
實驗名稱:打印機隊列模擬學(xué)號:20124848 批閱教師簽字:
程序的設(shè)計
實驗編號:實驗一 姓名: 實驗日期:2014年5 月 24 日
一、實驗?zāi)康?/strong>
對隊列的理解
對STL中的queue的使用
實驗仿真一個網(wǎng)絡(luò)打印過程
二、實驗內(nèi)容與實驗步驟流程圖
這個任務(wù)隊列的測試使用STL隊列適配器。程序要求完成模擬的實現(xiàn)共享打印機。這個打印機使用先進先出隊列。仿真是通過讀取和處理事件數(shù)據(jù)文件的`列表。一個有效的數(shù)據(jù)文件中的每一行包含信息打印作業(yè)和提交這份工作的時間。
具體地說,每一行中包含的信息是提交工作的時間(以秒為單位),和在頁面的工作長及工作的計算機的名稱。在模擬的開始,每個這些事件的每一個應(yīng)該被程序所讀,存儲在繼承工作負(fù)載隊列。程序應(yīng)該通過循環(huán)遞增計數(shù)器或while-loop模擬時間的流逝。程序應(yīng)該將計數(shù)器初始化為零,然后依次增加1秒。當(dāng)模擬等于當(dāng)前時間的打印作業(yè)的提交時間在工作隊列的前面,一個打印作業(yè)完成。當(dāng)這一切發(fā)生的時候,從工作隊列取出這個事件,然后把它放在另一個隊列對象。這個隊列對象存儲已完成的打印作業(yè)。當(dāng)程序仿真其他的打印工作的時候,這些工作在隊列等待。
Win8,Visual C++ 6.0
四、實驗過程與分析
(1)實驗主要函數(shù)及存儲結(jié)構(gòu)
main.cpp 包括主函數(shù)和主要的功能
simulator.h 仿真類的聲明
simulator.cpp 仿真類的定義
event.h 事件類的聲明
event.cpp - 事件類的定義
job.h 作業(yè)類的聲明
job.cpp 作業(yè)類的定義
包括任意打印作業(yè)數(shù)的數(shù)據(jù)文件
arbitrary.out 輸出
包括打印較大作業(yè)的數(shù)據(jù)文件
bigfirst.out 輸出
(2)實驗代碼
#ifndef FIFO_H //fifo.h
#define FIFO_H
#include "simulator.h"
class fifo:public simulator{
protected:
queue waiting;
priority_queue priority_waiting;
public:
fifo(int seconds_per_page);
void simulate(string file);
};
bool operator
#endif
#include "fifo.h" //fifo.cpp
#include
using namespace std;
fifo::fifo(int seconds_per_page):simulator(seconds_per_page){ }
void fifo::simulate(string file){
int finish_time = 0;
float agg_latency = 0;
int totaljob =0;
event evt;
if(file.find("arbitrary")!= string::npos){
string outfile ="arbitrary.out";
ofstream osf(outfile.c_str());
loadworkload(file);
osf
for(int time =1;!waiting.empty()||!workload.empty();time++){ while(!workload.empty() && time ==
workload.front().arrival_time()){
evt= workload.front();
osf
workload.pop();
}
if(!waiting.empty() && time >= finish_time){
totaljob ++;
evt = waiting.front();
agg_latency += time - evt.arrival_time();
osf
finish_time = time + evt.getjob().getnumpages() * seconds_per_page;
}
}
osf
osf
osf
return;
}
if(file.find("bigfirst") != string::npos){
string outfile = "bigfirst.out";
ofstream osf(outfile.c_str());
loadworkload(file);
osf
for(int time
=1;!priority_waiting.empty()||!workload.empty();time++){
while(!workload.empty() && time ==
workload.front().arrival_time()){
evt= workload.front();
osf
workload.pop();
}
if(!priority_waiting.empty() && time >= finish_time){
totaljob ++;
evt = priority_();
agg_latency += time - evt.arrival_time();
osf
finish_time = time + evt.getjob().getnumpages() * seconds_per_page; }
}
osf
osf
osf
return;
}
cerr
cerr
bool operator
return evtleft.getjob().getnumpages()
evtright.getjob().getnumpages();
}
五、實驗結(jié)果總結(jié)
經(jīng)測試,功能較為完整。代碼流程簡圖如下:
通過這次實驗,我了解了有關(guān)隊列方面的知識。掌握了隊列的邏輯結(jié)構(gòu),抽象數(shù)據(jù)類型,隊列的存儲方式等。運用先進先出表,仿真了網(wǎng)絡(luò)打印隊列。這都使我對數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)有了新的認(rèn)識與幫助。在實驗過程中,我也遇到了許多困難,從開始時對隊列運算的不熟悉,到逐漸查找資料,從而完成了實驗;六、附錄;-《數(shù)據(jù)結(jié)構(gòu)與算法分析》以及網(wǎng)上資料;
逐漸查找資料,從而完成了實驗。在今后的學(xué)習(xí)中,我將繼續(xù)努力,加強對堆棧,隊列等知識的學(xué)習(xí),以達(dá)到精益求精。
六、附錄
1)掌握棧和隊列這兩種特殊的線性表,熟悉它們的特性,在實際問題背景下靈活運用它們。
本實驗訓(xùn)練的要點是“?!焙汀瓣犃小钡挠^點;
1) 利用棧,實現(xiàn)數(shù)制轉(zhuǎn)換。
2) 利用棧,實現(xiàn)任一個表達(dá)式中的語法檢查(選做)。
3) 編程實現(xiàn)隊列在兩種存儲結(jié)構(gòu)中的基本操作(隊列的初始化、判隊列空、入隊列、出隊列);
順序棧:
Status InitStack(SqStack &S)
{
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
return ERROR;
=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status DestoryStack(SqStack &S)
{
free(S.base);
return OK;
}
Status ClearStack(SqStack &S)
{
=S.base;
return OK;
}
return OK;
return ERROR;
}
{
return -S.base;
}
Status GetTop(SqStack S,ElemType &e)
{
if(-S.base>=S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base) return ERROR;
=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*++=e;
return OK;
}
Status Push(SqStack &S,ElemType e)
{
if(-S.base>=S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
return ERROR;
=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*++=e;
return OK;
}
Status Pop(SqStack &S,ElemType &e)
return ERROR;
e=*--;
return OK;
}
{
ElemType *p;
p=(ElemType *)malloc(sizeof(ElemType));
if(!p) return ERROR;
p=;
while(p!=S.base)//上面一個...
{
p--;
printf(“%d ”,*p);
}
return OK;
}
{
int flag,TURE=OK,FALSE=ERROR;
ElemType e,x;
InitStack(S);
flag=OK;
while((x= getchar)!='#'&&flag)
case '{':
printf(“括號匹配成功!nn”);
break;
printf(“沒有滿足條件n”);
flag=FALSE;
}
break;
break;
break;
}
}
if (flag && x=='#' && StackEmpty(S))
return ERROR;
}
鏈隊列:
Status InitQueue(LinkQueue &Q)
{
Q.front =Q.rear=
(QueuePtr)malloc(sizeof(QNode));
if (!Q.front) return ERROR;
Q.front->next = NULL;
return OK;
}
Status DestoryQueue(LinkQueue &Q)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
Status QueueEmpty(LinkQueue &Q)
{
return OK;
return ERROR;
}
{
int i=0;
QueuePtr p,q;
p=Q.front;
{
i++;
p=Q.front;
q=p->next;
p=q;
}
return i;
}
Status GetHead(LinkQueue Q,ElemType &e)
{
QueuePtr p;
p=Q.front->next;
return ERROR;
e=p->data;
return e;
}
Status ClearQueue(LinkQueue &Q)
{
QueuePtr p;
{
p=Q.front->next;
free(Q.front);
Q.front=p;
}
Q.front->next=NULL;
Q.rear->next=NULL;
return OK;
}
Status EnQueue(LinkQueue &Q,ElemType e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof (QNode));
return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next = p;
return OK;
}
Status DeQueue(LinkQueue &Q,ElemType &e)
{
QueuePtr p;
return ERROR;
p = Q.front->next;
e = p->data;
Q.front->next = p->next;
Q.rear = Q.front; //只有一個元素時(不存在指向尾指針)
free (p);
return OK;
}
Status QueueTraverse(LinkQueue Q)
{
QueuePtr p,q;
{
printf(“這是一個空隊列!n”);
return ERROR;
}
p=Q.front->next;
{
q=p;
printf(“%ddata);
q=p->next;
p=q;
}
return OK;
}
循環(huán)隊列:
Status InitQueue(SqQueue &Q)
{
Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
exit(OWERFLOW);
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &Q,QElemType &e)
return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
{
return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}
Status DestoryQueue(SqQueue &Q)
{
free(Q.base);
return OK;
}
Status QueueEmpty(SqQueue Q) //判空
return OK;
return ERROR;
}
printf(“這是一個空隊列!”);
Q.front++;
}
return OK;
}
數(shù)據(jù)結(jié)構(gòu)報告
引言:
數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)中的一門重要課程,它研究如何組織和存儲數(shù)據(jù),以便在計算機中高效地操作和處理。數(shù)據(jù)結(jié)構(gòu)對于計算機科學(xué)的發(fā)展和應(yīng)用起著至關(guān)重要的作用。本報告將詳細(xì)介紹數(shù)據(jù)結(jié)構(gòu)的相關(guān)主題,包括數(shù)組、鏈表、棧、隊列和樹等。
一、數(shù)組
數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu),它由相同類型的元素組成,并按照一定的順序存儲在內(nèi)存中。數(shù)組提供了按下標(biāo)隨機訪問元素的能力,具有快速讀取和修改元素的特點。本節(jié)將介紹數(shù)組的定義、基本操作及其在實際應(yīng)用中的使用。
二、鏈表
鏈表是另一種常見的線性數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點組成,每個節(jié)點包含數(shù)據(jù)和指向下一個節(jié)點的指針。與數(shù)組相比,鏈表的插入和刪除操作更加靈活,但訪問元素時需要遍歷整個鏈表。本節(jié)將介紹鏈表的分類、基本操作以及它在實際應(yīng)用中的應(yīng)用場景。
三、棧
棧是一種具有特殊操作規(guī)則的線性數(shù)據(jù)結(jié)構(gòu),它遵循先進后出(Last In First Out,LIFO)的原則。棧主要包含入棧和出棧兩個基本操作,可以用于實現(xiàn)簡單的計算器、函數(shù)調(diào)用等。本節(jié)將介紹棧的定義、基本操作以及它在計算機系統(tǒng)中的應(yīng)用。
四、隊列
隊列是一種具有特殊操作規(guī)則的線性數(shù)據(jù)結(jié)構(gòu),它遵循先進先出(First In First Out,F(xiàn)IFO)的原則。隊列主要包含入隊和出隊兩個基本操作,可以用于實現(xiàn)線程池、消息隊列等。本節(jié)將介紹隊列的定義、基本操作以及它在實際應(yīng)用中的使用。
五、樹
樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),由節(jié)點和邊組成,節(jié)點之間存在層次關(guān)系。樹具有層次性、唯一根節(jié)點和子樹的遞歸結(jié)構(gòu)等特點。樹的應(yīng)用非常廣泛,比如文件系統(tǒng)、數(shù)據(jù)庫索引和圖像壓縮等。本節(jié)將介紹樹的定義、基本概念以及常見的樹結(jié)構(gòu)和它們的應(yīng)用場景。
六、總結(jié)
數(shù)據(jù)結(jié)構(gòu)是計算機科學(xué)的基礎(chǔ),它為我們提供了有效存儲和操作數(shù)據(jù)的方法。通過本報告的詳細(xì)介紹,我們了解了數(shù)組、鏈表、棧、隊列和樹等常見的數(shù)據(jù)結(jié)構(gòu),以及它們在實際應(yīng)用中的使用場景。在實際開發(fā)中,根據(jù)不同的問題需求選擇合適的數(shù)據(jù)結(jié)構(gòu)非常重要,只有熟練掌握數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用,才能更高效地解決實際問題。
參考文獻:
1.《數(shù)據(jù)結(jié)構(gòu)與算法分析- C語言描述》
2.《數(shù)據(jù)結(jié)構(gòu)與算法分析- Java語言描述》
3.《Introduction to Algorithms》
附錄:數(shù)據(jù)結(jié)構(gòu)相關(guān)算法代碼實現(xiàn)及其測試用例
相信《2024數(shù)據(jù)結(jié)構(gòu)報告》一文能讓您有很多收獲!“幼兒教師教育網(wǎng)”是您了解幼師資料,工作計劃的必備網(wǎng)站,請您收藏yjs21.com。同時,編輯還為您精選準(zhǔn)備了數(shù)據(jù)結(jié)構(gòu)報告專題,希望您能喜歡!
相關(guān)推薦
紙上得來終覺淺,絕知此事要躬行,在我們的學(xué)習(xí)或者工作中,寫報告是必不可少的。優(yōu)秀的報告模板有哪些?我來分享一篇網(wǎng)絡(luò)文章是關(guān)于“數(shù)據(jù)分析報告”,將這個信息分享給你的親朋好友讓大家都知道吧!...
編輯整理了以下有關(guān)“數(shù)據(jù)調(diào)研報告”的內(nèi)容供您參考,希望這些研究能夠為你提供一些有益的見解和知識。紙上得來終覺淺,絕知此事要躬行,每當(dāng)我們完成一項任務(wù)時。我們需要撰寫報告,作報告的側(cè)重點在于口頭演講匯報,主要用于新聞媒體或者給群眾作報告。...
撰寫報告時我們可以從哪些角度著手?為了向領(lǐng)導(dǎo)更好地匯報工作,一般都會需要撰寫報告。通常報告一般由標(biāo)題、正文、結(jié)尾三部分組成,欄目小編向您推薦“數(shù)據(jù)報告”相信您一定不會失望,下面的信息僅供大家參考希望大家閱讀!...
一般而言,只有實踐能克服經(jīng)驗的錯誤,不管是上學(xué)還是工作的時候。需要使用報告的情況越來越多,報告具有匯報性,主要是匯報相關(guān)工作內(nèi)容和數(shù)據(jù),報告可以從哪些方面寫好呢?為了更方便使用小編整理了“統(tǒng)計數(shù)據(jù)自查報告”類的內(nèi)容,歡迎大家一起分享自己的經(jīng)驗和知識讓更多人受益!...
倘若您對此議題感到困惑不解,或許可以考慮一讀《大數(shù)據(jù)報告》,它或能給出啟發(fā)。俗話說,眼見為實,為了更具體地表述一些數(shù)據(jù),我們經(jīng)常需撰寫報告。而這些報告的內(nèi)容需要經(jīng)過深思熟慮,決不能敷衍了事。相信您能從本文中獲取所需的幫助!...
最新更新