幼兒教師教育網(wǎng),為您提供優(yōu)質(zhì)的幼兒相關(guān)資訊

2024數(shù)據(jù)結(jié)構(gòu)報(bào)告

發(fā)布時(shí)間:2024-09-22

我們聽了一場(chǎng)關(guān)于“數(shù)據(jù)結(jié)構(gòu)報(bào)告”的演講讓我們思考了很多,平常學(xué)習(xí)工作中。很多時(shí)候我們都需要去寫一份報(bào)告,將結(jié)果整理成報(bào)告對(duì)我們來(lái)說(shuō)更便于閱讀和理解,撰寫報(bào)告時(shí)我們可以從哪些角度著手?經(jīng)過(guò)閱讀本頁(yè)你的認(rèn)識(shí)會(huì)更加全面。

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇1

數(shù)據(jù)結(jié)構(gòu)報(bào)告

引言:

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)的一個(gè)基礎(chǔ)概念,它涉及組織和管理數(shù)據(jù)的方法和原則。在計(jì)算機(jī)科學(xué)領(lǐng)域,數(shù)據(jù)結(jié)構(gòu)是一種將數(shù)據(jù)元素組織為不同形式的數(shù)據(jù)集合的方法。本報(bào)告將介紹數(shù)據(jù)結(jié)構(gòu)的重要性、主要類型、應(yīng)用領(lǐng)域以及未來(lái)的發(fā)展趨勢(shì)。

一、數(shù)據(jù)結(jié)構(gòu)的重要性:

數(shù)據(jù)結(jié)構(gòu)對(duì)于計(jì)算機(jī)科學(xué)至關(guān)重要。在計(jì)算機(jī)程序中,數(shù)據(jù)的組織和存儲(chǔ)方式直接影響程序的效率和可維護(hù)性。良好的數(shù)據(jù)結(jié)構(gòu)可以提供高效的數(shù)據(jù)訪問(wèn)和操作,從而提高程序的執(zhí)行效率。此外,數(shù)據(jù)結(jié)構(gòu)還能夠幫助開發(fā)人員理清程序中各個(gè)數(shù)據(jù)元素之間的關(guān)系,提供良好的邏輯結(jié)構(gòu),使得程序的開發(fā)、維護(hù)和擴(kuò)展更加容易。

二、主要類型:

數(shù)據(jù)結(jié)構(gòu)主要分為線性結(jié)構(gòu)、樹結(jié)構(gòu)和圖結(jié)構(gòu)三類。

1. 線性結(jié)構(gòu):包括數(shù)組、鏈表、棧和隊(duì)列等。數(shù)組是一種靜態(tài)線性結(jié)構(gòu),具有連續(xù)的存儲(chǔ)空間,適合隨機(jī)訪問(wèn);鏈表是一種動(dòng)態(tài)線性結(jié)構(gòu),存儲(chǔ)空間可以動(dòng)態(tài)分配,適合插入和刪除操作;棧是一種先進(jìn)后出(LIFO)的線性結(jié)構(gòu);隊(duì)列是一種先進(jìn)先出(FIFO)的線性結(jié)構(gòu)。

2. 樹結(jié)構(gòu):包括二叉樹、AVL樹、紅黑樹等。樹結(jié)構(gòu)由節(jié)點(diǎn)和邊組成,每個(gè)節(jié)點(diǎn)可以有多個(gè)子節(jié)點(diǎn)。二叉樹是一種特殊的樹結(jié)構(gòu),每個(gè)節(jié)點(diǎn)最多只有兩個(gè)子節(jié)點(diǎn)。

3. 圖結(jié)構(gòu):由節(jié)點(diǎn)和邊組成,節(jié)點(diǎn)之間可以有多條邊相連。圖結(jié)構(gòu)可以分為有向圖和無(wú)向圖,有向圖中的邊有方向,無(wú)向圖中的邊沒(méi)有方向。

三、數(shù)據(jù)結(jié)構(gòu)的應(yīng)用領(lǐng)域:

數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)科學(xué)的各個(gè)領(lǐng)域都有廣泛應(yīng)用。

1. 數(shù)據(jù)庫(kù)系統(tǒng):數(shù)據(jù)結(jié)構(gòu)用于組織和管理數(shù)據(jù)庫(kù)中的數(shù)據(jù),包括數(shù)據(jù)表、索引、視圖等。

2. 算法設(shè)計(jì)和分析:數(shù)據(jù)結(jié)構(gòu)是設(shè)計(jì)和實(shí)現(xiàn)高效算法的基礎(chǔ),不同的數(shù)據(jù)結(jié)構(gòu)適用于不同的算法問(wèn)題。

3. 操作系統(tǒng):數(shù)據(jù)結(jié)構(gòu)用于管理操作系統(tǒng)中的進(jìn)程、文件系統(tǒng)和內(nèi)存等。

4. 網(wǎng)絡(luò)和圖像處理:數(shù)據(jù)結(jié)構(gòu)可以用于網(wǎng)絡(luò)路由算法和圖像壓縮等應(yīng)用。

5. 人工智能:數(shù)據(jù)結(jié)構(gòu)在機(jī)器學(xué)習(xí)和深度學(xué)習(xí)等領(lǐng)域有重要作用。

四、數(shù)據(jù)結(jié)構(gòu)的發(fā)展趨勢(shì):

隨著計(jì)算機(jī)科學(xué)的不斷發(fā)展,數(shù)據(jù)結(jié)構(gòu)也在不斷演進(jìn)和創(chuàng)新。

1. 高性能數(shù)據(jù)結(jié)構(gòu):為了提高程序的執(zhí)行效率,研究人員致力于設(shè)計(jì)高性能的數(shù)據(jù)結(jié)構(gòu),如哈希表、跳表等。

2. 大數(shù)據(jù)處理:隨著大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)結(jié)構(gòu)需要能夠處理海量的數(shù)據(jù),如分布式哈希表、B樹等。

3. 數(shù)據(jù)隱私與安全:在數(shù)據(jù)共享和隱私保護(hù)中,數(shù)據(jù)結(jié)構(gòu)需要具備安全性,如保護(hù)數(shù)據(jù)的隱私和防止數(shù)據(jù)泄露。

4. 學(xué)科交叉融合:數(shù)據(jù)結(jié)構(gòu)與其他學(xué)科的交叉融合也是未來(lái)的發(fā)展方向,如數(shù)據(jù)結(jié)構(gòu)與人工智能、數(shù)據(jù)結(jié)構(gòu)與生物學(xué)等領(lǐng)域的結(jié)合。

結(jié)論:

數(shù)據(jù)結(jié)構(gòu)作為計(jì)算機(jī)科學(xué)的基礎(chǔ)概念,對(duì)于程序的性能和可維護(hù)性至關(guān)重要。通過(guò)良好的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì),我們可以提高程序的效率,并且使得程序的開發(fā)、維護(hù)和擴(kuò)展更加容易。隨著計(jì)算機(jī)科學(xué)的發(fā)展,數(shù)據(jù)結(jié)構(gòu)也在不斷演變和創(chuàng)新,滿足不同應(yīng)用領(lǐng)域和需求。因此,深入理解和掌握數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用是每一個(gè)計(jì)算機(jī)科學(xué)從業(yè)者所必備的基本素質(zhì)。

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇2

問(wèn)題描述:;四則運(yùn)算表達(dá)式求值,將四則運(yùn)算表達(dá)式用中綴表達(dá)式;一、需求分析:;輸入輸出格式:;輸入格式:在字符界面上輸入一個(gè)中綴表達(dá)式,回車表;請(qǐng)輸入表達(dá)式:;輸入一個(gè)中綴表達(dá)式;輸出格式:如果該中綴表達(dá)式正確,那么在字符界面上;式,其中后綴表達(dá)式中兩相鄰操作數(shù)之間利用空格隔開;果不正確,在字符界面上輸出

問(wèn)題描述:

四則運(yùn)算表達(dá)式求值,將四則運(yùn)算表達(dá)式用中綴表達(dá)式,然后轉(zhuǎn)換為后綴表達(dá)式,并計(jì)算結(jié)果。

一、 需求分析:

1、本程序是利用二叉樹后序遍歷來(lái)實(shí)現(xiàn)表達(dá)式的轉(zhuǎn)換,同時(shí)可以使用實(shí)驗(yàn)三的結(jié)果來(lái)求解后綴表達(dá)式的值。

2、輸入輸出格式:

輸入格式:在字符界面上輸入一個(gè)中綴表達(dá)式,回車表示結(jié)束。

請(qǐng)輸入表達(dá)式:

輸入一個(gè)中綴表達(dá)式

輸出格式:如果該中綴表達(dá)式正確,那么在字符界面上輸出其后綴表達(dá)

式,其中后綴表達(dá)式中兩相鄰操作數(shù)之間利用空格隔開;如

果不正確,在字符界面上輸出表達(dá)式錯(cuò)誤提示。

逆波蘭表達(dá)式為:

3、測(cè)試用例

輸入:21+23*(12-6)

輸出:21 23 12 6 -*+ 輸出逆波蘭表達(dá)式 運(yùn)算結(jié)果為:輸出運(yùn)算后的結(jié)果

二、概要設(shè)計(jì) :

抽象數(shù)據(jù)類型

二叉樹類BiTree

算法的基本思想

根據(jù)題目要求,利用棧計(jì)算,和二叉樹存儲(chǔ),來(lái)計(jì)算表達(dá)式

該算法的基本思想是:

先利用棧進(jìn)行計(jì)算,然后用二叉樹進(jìn)行存儲(chǔ),和實(shí)驗(yàn)三算法一樣來(lái)計(jì)算逆波蘭表達(dá)式的值

程序的流程

程序由三個(gè)模塊組成:

(1) 輸入模塊:輸入一個(gè)運(yùn)算式

(2) 計(jì)算模塊:利用棧進(jìn)行表達(dá)式的計(jì)算,二叉樹來(lái)存儲(chǔ)。 (3 ) 輸出模塊:屏幕上顯示出后綴表達(dá)式和運(yùn)算結(jié)果。

三、詳細(xì)設(shè)計(jì)

物理數(shù)據(jù)類型

程序含有兩個(gè)類,其中棧不再贅述,另一個(gè)類為二叉樹class BiTree包含私有成員struct BiTreeNode,根節(jié)點(diǎn)BiTreeNode *T;索引index; int number_of_point 優(yōu)先級(jí)比較函數(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ù)則是對(duì)私有函數(shù)的重載,為方便使用,因?yàn)楹瘮?shù)中普遍使用了遞歸的算法。

算法的時(shí)空分析

此算法利用棧和二叉樹來(lái)實(shí)現(xiàn),故次算法的的時(shí)間復(fù)雜度為(N)。

輸入和輸出的格式

輸入格式:請(qǐng)輸入表達(dá)式:

輸入一個(gè)中綴表達(dá)式 //回車

輸出格式:逆波蘭表達(dá)式為:

輸出逆波蘭表達(dá)式

運(yùn)算結(jié)果為:輸出運(yùn)算后的結(jié)果

四、調(diào)試分析

略。

五、測(cè)試結(jié)果

本實(shí)驗(yàn)的測(cè)試結(jié)果截圖如下:

六、用戶使用說(shuō)明(可選)

運(yùn)行程序時(shí)

提示輸入表達(dá)式

本程序可以將中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式后在計(jì)算出運(yùn)算式的結(jié)果。 提示:請(qǐng)輸入表達(dá)式:

輸出

提示:逆波蘭表達(dá)式為:

運(yùn)算結(jié)果:

七、實(shí)驗(yàn)心得(可選)

本次實(shí)驗(yàn)過(guò)程比較復(fù)雜,由于書上的`知識(shí)掌握的還不是很牢靠,所以現(xiàn)在實(shí)驗(yàn)做起來(lái)有點(diǎn)兒吃力。本實(shí)驗(yàn)主要是通過(guò)與同學(xué)的討論和課后查閱資料來(lái)完成的,雖然有些地方還不是很懂,但基本上能完成此次實(shí)驗(yàn)的內(nèi)容。而且通過(guò)本次實(shí)驗(yàn),加深了對(duì)二叉樹算法的了解。

附錄(實(shí)驗(yàn)代碼):

#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字符串中字符的個(gè)數(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 = (); //先右子樹,否則運(yùn)算次序反了

PTR.pop ();

T->lchild = ();

PTR.pop ();

PTR.push (T);

}

char symbol[5][5]={{'>', '>', ''}, //符號(hào)優(yōu)先級(jí)

{'>', '>', ''},

{'>', '>', '>', '>', '>'},

{'>', '>', '>', '>', '>'},

{'

int sym2num(char s) //返回符號(hào)對(duì)應(yīng)優(yōu)先級(jí)矩陣位置 { 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) //返回符號(hào)優(yōu)先級(jí)

{return(symbol[sym2num(a)][sym2num(b)]);}

void CrtExptree(BiTree &T, char exp[])

{ //根據(jù)字符串exp的內(nèi)容構(gòu)建表達(dá)式樹T

stack PTR;//存放表達(dá)式樹中的節(jié)點(diǎn)指針

stack OPTR;//存放操作符

char op;

int i=0;

OPTR.push ('#');

op = ();

while( !((exp[i]=='#') && (()=='#')) ) //與

{

if (IsDigital(exp[i]))

{//建立葉子節(jié)點(diǎn)并入棧 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ù)據(jù)結(jié)構(gòu)報(bào)告 篇3

設(shè)計(jì)題目:模擬計(jì)算器程序

學(xué)生姓名:謝先斌

系 別:計(jì)算機(jī)與通信工程學(xué)院

專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)

班 級(jí):1班

學(xué) 號(hào):541007010144

指導(dǎo)教師:盧冰 李曄

2012 年 6 月 21 日

鄭州輕工業(yè)學(xué)院

課 程 設(shè) 計(jì) 任 務(wù) 書

題目 模擬計(jì)算器程序

專業(yè)、班級(jí) 計(jì)算機(jī)科學(xué)與技術(shù)10-01班 學(xué)號(hào) 541007010144 姓名 謝先斌

主要內(nèi)容:

設(shè)計(jì)一個(gè)模擬計(jì)算器的程序,要求能對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQR和ABS函數(shù)的任意整型表達(dá)式進(jìn)行求解。

基本要求:

要檢查有關(guān)運(yùn)算的條件,并對(duì)錯(cuò)誤的條件產(chǎn)生報(bào)警。

主要參考資料:

[第52頁(yè)3.2.5表達(dá)式求值

完 成 期 限: 2012年6月21日

指導(dǎo)教師簽名:

課程負(fù)責(zé)人簽名:

2012年 6月 21 日

一、 設(shè)計(jì)題目

模擬計(jì)算器的程序

設(shè)計(jì)一個(gè)模擬計(jì)算器的程序,要求能對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQR和ABS函數(shù)的任意整型表達(dá)式進(jìn)行求解。

設(shè)計(jì)要求:要檢查有關(guān)運(yùn)算的條件,并對(duì)錯(cuò)誤的條件產(chǎn)生報(bào)警。

二、 算法設(shè)計(jì)的思想

本程序設(shè)計(jì)主要是應(yīng)用了棧,利用棧的“先進(jìn)后出”原理,建立了兩個(gè)棧,分別為運(yùn)算符棧pOStack和運(yùn)算數(shù)棧pDStack。算法的基本思想(參考課本p53頁(yè))是:

(1) 首先置操作數(shù)棧為pDStack空棧,表達(dá)式起始符為“=”,位運(yùn)算符棧的棧底元素;

(2) 依次讀入表達(dá)式中的每個(gè)字符,若是操作數(shù)則進(jìn)入pDStack棧,若是運(yùn)算符則和pOStack棧的棧定運(yùn)算符比較優(yōu)先權(quán)后作相應(yīng)操作,直到整個(gè)表達(dá)式求值完畢(即pOStack棧的棧定元素和當(dāng)前讀入的字符均為“=” )。

三、 算法的流程圖

本程序的流程如下附圖1所示:

附圖1 程序流程圖

四、 算法設(shè)計(jì)分析

首先創(chuàng)建了兩個(gè)棧:

typedef struct OPStack //定義運(yùn)算符棧

{

char opStack[MAX_OPERATOR_NUM];

int top;

}OPStack, *pOPStack;

typedef struct DATAStack //定義運(yùn)算數(shù)棧

{

double stack[MAX_DATA_NUM];

int top;

}DATAStack, *pDATAStack;

來(lái)分別存放運(yùn)算符和運(yùn)算數(shù)。在兩個(gè)結(jié)構(gòu)體中均有一個(gè)top數(shù)據(jù)域,當(dāng)top=-1時(shí),表示該站為空棧。

定義一個(gè)Evaluateexpression_r()函數(shù)來(lái)完成函數(shù)運(yùn)算的主要功能:讀入表達(dá)式,并計(jì)算結(jié)果。以下是對(duì)該函數(shù)的分析:

當(dāng)一次運(yùn)算開始時(shí),分別調(diào)用InitpOPStack(pOPStack &pOStack)函數(shù)和InitpDATAStack(pDATAStack &pDStack)函數(shù)分別對(duì)運(yùn)算符棧和運(yùn)算數(shù)棧進(jìn)行初始化。調(diào)用PushOPStack(pOStack, '=')函數(shù)來(lái)完成運(yùn)算符棧棧低元素的設(shè)置。

通過(guò)PushOPStack(pOPStack &pOStack, char ch)函數(shù)、

PopOPStack(pOPStack &pOStack, char &ch)函數(shù)、

PushDATAStack(pDATAStack &pDStack, double d)函數(shù)和PopDATAStack(pDATAStack &pDStack, double &d)函數(shù)來(lái)分別完成運(yùn)算符和運(yùn)輸數(shù)的進(jìn)出棧操作。getToppOPStack(pOPStack &pOStack)函數(shù)和getToppDATAStack(pDATAStack &pDStack) 函數(shù)主要是進(jìn)行得到棧定元素的作用,特別是在對(duì)運(yùn)算符棧優(yōu)先級(jí)的比較中十分重要,其中還會(huì)調(diào)用IsOP(char &ch) 函數(shù)來(lái)區(qū)分讀入的是運(yùn)算符還是運(yùn)算數(shù)。

ChangeChar(char &c)函數(shù)當(dāng)每次讀入一個(gè)字符是都會(huì)調(diào)用一次,主要的作用就是完成不用區(qū)分A、S的大小的功能。

Precede(char op>、=”結(jié)果來(lái)進(jìn)行下一步的操作:''表示運(yùn)算符和運(yùn)算數(shù)各退棧一次并調(diào)用Operate(double a, char theta, double b)函數(shù)(主要是對(duì)出棧的運(yùn)算符和運(yùn)算數(shù)進(jìn)行計(jì)算),最后將運(yùn)算結(jié)果壓入運(yùn)算數(shù)棧pDStack。

當(dāng)操作結(jié)束時(shí)運(yùn)算數(shù)棧的棧頂元素就是計(jì)算結(jié)果,分別調(diào)用ClearpOPStack(pOStack)函數(shù)清空運(yùn)算符棧、ClearpDATAStack(pDStack)函數(shù)清空運(yùn)算數(shù)棧以待下一次繼續(xù)進(jìn)行相關(guān)操作。

print_user()函數(shù)和exit_E()函數(shù)開始和結(jié)束時(shí)個(gè)調(diào)用一次,分別完成歡迎界面和退出界面的布置。main()是本程序的主函數(shù),主要通過(guò)while語(yǔ)句和switch語(yǔ)句來(lái)完成本程序的運(yùn)行,當(dāng)輸入Y(y)時(shí)調(diào)用Evaluateexpression_r()函數(shù)完成計(jì)算,當(dāng)輸入N(n)時(shí),調(diào)用exit_E()函數(shù)退出本程序的運(yùn)行。

本程序還考慮到各種異常的處理,如運(yùn)算時(shí)除數(shù)為0、被開方數(shù)為0等情況的出現(xiàn),最終的處理是直接退出程序的運(yùn)行。

五、 運(yùn)行結(jié)果分析

1. 程序開始界面,如附圖2:

附圖2 開始界面

2.如下附圖3,附圖4分別是選擇進(jìn)入和退出程序界面:

附圖3(在以下界面輸入計(jì)算式即可運(yùn)行出計(jì)算結(jié)果如附圖5)

附圖4 退出界面

附圖5 運(yùn)行界面

2. 對(duì)異常的處理

a) 對(duì)異常1除數(shù)為0,如輸入“1+2/0=”程序?qū)⒅苯油顺觯绺綀D6:

附圖6 異常1除數(shù)為0

b) 對(duì)異常2被開方數(shù)為負(fù)數(shù),如輸入“3+S(-9)=”程序?qū)⒅苯油顺?,如附圖7:

附圖7 異常2被開方數(shù)為負(fù)數(shù)

3.以下是對(duì)各種簡(jiǎn)單運(yùn)算的運(yùn)行結(jié)果,如附圖8:

附圖8 簡(jiǎn)單運(yùn)算

3. 綜合運(yùn)算:如式子“1/2+A(7-8)-S(9*8)=”運(yùn)行結(jié)果如附圖9

附圖9 綜合運(yùn)算

六、 收獲及體會(huì)

本程序以C語(yǔ)言的棧的相關(guān)知識(shí)為基礎(chǔ),通過(guò)控制兩個(gè)棧(運(yùn)算數(shù)棧和運(yùn)算符棧)的進(jìn)出的棧操作,來(lái)實(shí)現(xiàn)對(duì)包含加、減、乘、除、括號(hào)運(yùn)算符及SQRT和ABS函數(shù)的任意整型表達(dá)式的求解運(yùn)算。

從程序的編寫來(lái)看,感覺(jué)這次自己真的學(xué)到了好多,特別是對(duì)程序的開發(fā)流程。從最初的選定程序,到最終的程序運(yùn)行成功,讓我感到如果是僅僅掌握課本上的知識(shí)是遠(yuǎn)遠(yuǎn)不能夠很好的應(yīng)用到實(shí)際的編程中去的。在這個(gè)過(guò)程中還需要我們更多的去考慮到實(shí)際條件的種種限制和約束。

我在寫本程序的過(guò)程中也遇到了很多的問(wèn)題,當(dāng)然本程序的.核心問(wèn)題就是對(duì)兩個(gè)棧的壓出棧操作,需要做優(yōu)先級(jí)判斷,并要考慮什么時(shí)候進(jìn)棧,什么時(shí)候出棧等操作。我采用了課本上第()AS=”共被開方數(shù)小于N、A、S等字符也進(jìn)行了改進(jìn),最終本程序可以不區(qū)分大小寫就完成相關(guān)操作。

總之,經(jīng)過(guò)本次專業(yè)課程設(shè)計(jì),讓我掌握了開發(fā)應(yīng)用軟件的基本流程,運(yùn)用所學(xué)編程技能的基本技巧,也讓我初步了解了軟件設(shè)計(jì)的基本方法,提高進(jìn)行工程設(shè)計(jì)的基本技能及分析、解決實(shí)際問(wèn)題的能力,為以后畢業(yè)設(shè)計(jì)和工程實(shí)踐等打下良好的基礎(chǔ)。相信通過(guò)這次的課程設(shè)計(jì),我對(duì)所學(xué)的《數(shù)據(jù)結(jié)構(gòu)(C語(yǔ)言版)》和各種編程語(yǔ)言都有了一個(gè)全新的認(rèn)識(shí)。我也會(huì)積極吸取本次課程設(shè)計(jì)的經(jīng)驗(yàn),繼續(xù)研究數(shù)據(jù)結(jié)構(gòu)和所學(xué)的各種編程語(yǔ)言。

七、 源代碼

# include

# include

# include

# include

# define MAX_OPERATOR_NUM 100 //運(yùn)算符棧數(shù)組長(zhǎng)度

# define MAX_DATA_NUM 100 //運(yùn)算數(shù)棧數(shù)組長(zhǎng)度

typedef struct OPStack //定義運(yùn)算符棧

{

char opStack[MAX_OPERATOR_NUM];

int top;

}OPStack, *pOPStack;

typedef struct DATAStack //定義運(yùn)算數(shù)棧

{

double stack[MAX_DATA_NUM];

int top;

}DATAStack, *pDATAStack;

void InitpOPStack(pOPStack &pOStack) //初始化運(yùn)算符棧

{

if( !(pOStack = (pOPStack)malloc(sizeof(OPStack)))) //為運(yùn)算符棧分配空間

{

printf("分配內(nèi)存空間失敗! ");

exit(-1);

}

pOStack->top = -1;

}

void InitpDATAStack(pDATAStack &pDStack) //初始化運(yùn)算數(shù)棧

{

if( !(pDStack = (pDATAStack)malloc(sizeof(DATAStack)))) //為運(yùn)算數(shù)棧分配空間

{

printf("分配內(nèi)存空間失敗! ");

exit(-1);

}

pDStack->top = -1;

}

void PushOPStack(pOPStack &pOStack, char ch) //運(yùn)算符進(jìn)棧

{

pOStack->opStack[++(pOStack->top)] = ch;

}

void PopOPStack(pOPStack &pOStack, char &ch) //運(yùn)算符出棧

{

ch = pOStack->opStack[pOStack->top];

pOStack->top--;

}

void PushDATAStack(pDATAStack &pDStack, double d) //運(yùn)算數(shù)進(jìn)棧

{

++(pDStack->top);

pDStack->stack[pDStack->top] = d;

}

void PopDATAStack(pDATAStack &pDStack, double &d) //運(yùn)算數(shù)出棧

{

d = pDStack->stack[pDStack->top];

pDStack->top--;

}

void ClearpOPStack(pOPStack &pOStack) //清空運(yùn)算符棧

{

pOStack->top = -1;

}

void ClearpDATAStack(pDATAStack &pDStack) //清空運(yùn)算數(shù)棧

{

pDStack->top = -1;

}

char GetToppOPStack(pOPStack &pOStack) //獲取運(yùn)算符棧頂元素

{

return pOStack->opStack[pOStack->top];

}

double GetToppDATAStack(pDATAStack &pDStack) //獲取運(yùn)算數(shù)棧頂元素

{

return pDStack->stack[pDStack->top];

}

bool IsOP(char &ch) //區(qū)分 運(yùn)算符 和 運(yùn)算數(shù) 的函數(shù),是運(yùn)算符時(shí)返回true,否則返回false

{ //判斷是否為符號(hào)

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語(yǔ)言版)第53頁(yè) 3.2.5表達(dá)式求值 表 3.1

{

char tab[9][10]; //定義字符串的二維數(shù)組來(lái)存放運(yùn)算符優(yōu)先級(jí)的關(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) //對(duì)出棧的運(yùn)算符和運(yùn)算數(shù)進(jìn)行計(jì)算

{

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,非法運(yùn)算。程序終止! #### ");

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ù)的平方根是非法運(yùn)算。程序終止! #### ");

exit_E(); //打印結(jié)束菜單

exit(-1);

}

}

return s;

}

char ChangeChar(char &c) //通過(guò)ChangeChar函數(shù)來(lái)把a(bǔ)、s的小寫字母改為大寫的

{

if( c == 'a' )

c = 'A';

else if( c == 's' )

c = 'S';

return c;

}

//參考《數(shù)據(jù)結(jié)構(gòu)》(C語(yǔ)言版)第53頁(yè) 3.2.5表達(dá)式求值算法3.4 Evaluateexpression_r()函數(shù)

void Evaluateexpression_r() //計(jì)算函數(shù):讀入表達(dá)式,并計(jì)算結(jié)果

{

pOPStack pOStack; //聲明運(yùn)算符棧

pDATAStack pDStack; //聲明運(yùn)算數(shù)棧

double result; //存運(yùn)算的結(jié)果

char x, theta, c; //c存放讀取的字符,x、theta存放運(yùn)算符棧的棧頂元素

int flag, data; //標(biāo)識(shí)符,用來(lái)讀入連續(xù)的數(shù)字

double s;

double getd; //存放GetTop***的結(jié)果

double a, b, cc; //a,b存放數(shù)據(jù)棧出棧的棧頂元素, c存放運(yùn)算結(jié)果

flag = 0; //初始化標(biāo)識(shí)符,用來(lái)判斷字符串中的連續(xù)數(shù)字

data = 0; //

InitpOPStack(pOStack); //初始化運(yùn)算符棧

InitpDATAStack(pDStack); //初始化運(yùn)算數(shù)棧

PushOPStack(pOStack, '='); //在運(yùn)算符棧底放入'='

printf(" &請(qǐng)輸入表達(dá)式以'='結(jié)束:");

c = get); //讀入字符

ChangeChar(c); //通過(guò)調(diào)用函數(shù)來(lái)實(shí)現(xiàn)把小寫的a、s改為大寫的A、S

while( c != '=' || GetToppOPStack(pOStack) != '=')

{

if( !IsOP(c) ) //不是運(yùn)算符進(jìn)棧

{

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) ) //輸入元素和運(yùn)算符棧頂元素比較

{

case '

PushOPStack(pOStack, c);

c = get);

ChangeChar(c);

break;

case '=': //托括號(hào)并接受下一個(gè)字符

PopOPStack(pOStack, x);

c = get);

ChangeChar(c);

break;

case '>': //退棧并將運(yùn)算結(jié)果進(jìn)棧

PopOPStack(pOStack, theta);

PopDATAStack(pDStack, b);

PopDATAStack(pDStack, a);

cc = Operate(a, theta, b);

PushDATAStack(pDStack, cc);

break;

}//switch

}//else

}//while

result = GetToppDATAStack(pDStack); //運(yùn)算結(jié)束時(shí),運(yùn)算數(shù)棧的棧底元素就是計(jì)算結(jié)果

ClearpOPStack(pOStack); //清空運(yùn)算符棧

ClearpDATAStack(pDStack); //清空運(yùn)算數(shù)棧

printf(" ->計(jì)算結(jié)果為:%.2f ", result); //輸出運(yùn)算結(jié)果

return ;

}

void print_user() //歡迎界面

{

printf(" 歡迎使用C語(yǔ)言版模擬計(jì)算器 ");

printf("************************************************************************ ");

printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ");

printf(" | 模擬計(jì)算器使用說(shuō)明 | ");

printf(" | 作者:謝先斌 | ");

printf(" | 本程序包括對(duì)'+'、'-'、'*'、'/'、'()'的運(yùn)算 | ");

printf(" | 本程序中ABS()算用A()替代、SQRT()運(yùn)算用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)識(shí)符,用來(lái)標(biāo)識(shí)是否結(jié)束程序

b = true; //初始化,不結(jié)束

print_user(); //打印歡迎界面

printf(" *請(qǐng)確認(rèn)使用計(jì)算器Y/N:");

while(1)

{

scanf("%c", &in); //確認(rèn)是否繼續(xù)操作

get); //吃掉會(huì)車,避免干擾

switch(in)

{

case 'Y':

case 'y':

{

Evaluateexpression_r(); //進(jìn)入計(jì)算函數(shù):讀入表達(dá)式,并計(jì)算結(jié)果

break;

}

case 'N':

case 'n':

{

exit_E();

b = false;

break;

}

//default:

// printf(" **輸入錯(cuò)誤,請(qǐng)重新輸入Y/N:");

// break;

}

if(b==false) //如果 b==false ,退出整個(gè)程序

break;

printf(" *您確定要繼續(xù)使用計(jì)算機(jī)Y/N:");

get); //用getchar吃掉回車,避免對(duì)后續(xù)輸入中in的干擾

}

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇4

一、實(shí)驗(yàn)?zāi)康募耙?/strong>

1)掌握棧和隊(duì)列這兩種特殊的線性表,熟悉它們的特性,在實(shí)際問(wèn)題背景下靈活運(yùn)用它們。

本實(shí)驗(yàn)訓(xùn)練的要點(diǎn)是“?!焙汀瓣?duì)列”的觀點(diǎn);

二、實(shí)驗(yàn)內(nèi)容

1) 利用棧,實(shí)現(xiàn)數(shù)制轉(zhuǎn)換。

2) 利用棧,實(shí)現(xiàn)任一個(gè)表達(dá)式中的語(yǔ)法檢查(選做)。

判隊(duì)列空、入隊(duì)列、出隊(duì)列);

三、實(shí)驗(yàn)流程、操作步驟或核心代碼、算法片段

順序棧:

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)//上面一個(gè)...

{

p--;

printf("%d ",*p);

}

return OK;

}

Status Compare(SqStack &S)

{

int flag,TURE=OK,FALSE=ERROR;

ElemType e,x;

InitStack(S);

flag=OK;

printf("請(qǐng)輸入要進(jìn)?;虺鰲5脑兀?);

while((x= getchar)!='#'&&flag)

{

switch (x)

{

case '(':

case '[':

case '{':

if(Push(S,x)==OK)

printf("括號(hào)匹配成功! ");

break;

case ')':

if(Pop(S,e)==ERROR || e!='(')

{

printf("沒(méi)有滿足條件 ");

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;

}

鏈隊(duì)列:

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; //只有一個(gè)元素時(shí)(不存在指向尾指針)

free (p);

return OK;

}

Status QueueTraverse(LinkQueue Q)

{

QueuePtr p,q;

if( QueueEmpty(Q)==OK)

{

printf("這是一個(gè)空隊(duì)列! ");

return ERROR;

}

p=Q.front->next;

while(p)

{

q=p;

printf("%ddata);

q=p->next;

p=q;

}

return OK;

}

循環(huán)隊(duì)列:

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("這是一個(gè)空隊(duì)列!");

while(Q.front%MAXQSIZE!=Q.rear)

{

printf("%d

Q.front++;

}

return OK;

}

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇5


一、實(shí)驗(yàn)?zāi)康?/p>

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)與技術(shù)中非常重要的一門課程,它研究的是各種各樣的數(shù)據(jù)以及它們?cè)谟?jì)算機(jī)中的存儲(chǔ)和操作方式。本次實(shí)驗(yàn)旨在通過(guò)對(duì)不同數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)與應(yīng)用,進(jìn)一步理解和掌握各種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)、運(yùn)算和算法。


二、實(shí)驗(yàn)背景


數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)的重要基石之一,它可以幫助有效地組織和管理數(shù)據(jù)。實(shí)驗(yàn)課程的目的是通過(guò)實(shí)際操作來(lái)加深對(duì)數(shù)據(jù)結(jié)構(gòu)的理解,鍛煉的編程技能以及分析和解決實(shí)際問(wèn)題的能力。


三、實(shí)驗(yàn)過(guò)程


1. 實(shí)驗(yàn)環(huán)境的準(zhǔn)備


本次實(shí)驗(yàn)使用的編程語(yǔ)言是C++,需要首先配置好編程環(huán)境,安裝好相關(guān)的開發(fā)工具和庫(kù)文件。


2. 實(shí)驗(yàn)數(shù)據(jù)的準(zhǔn)備


在實(shí)驗(yàn)開始前,需要準(zhǔn)備好不同的數(shù)據(jù)集,這些數(shù)據(jù)集可以包括不同類型的數(shù)據(jù),例如整數(shù)、字符串等??梢詮奈募凶x取數(shù)據(jù),或者手動(dòng)輸入數(shù)據(jù)。


3. 實(shí)驗(yàn)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)


根據(jù)實(shí)驗(yàn)要求,需要實(shí)現(xiàn)多個(gè)數(shù)據(jù)結(jié)構(gòu),例如鏈表、棧、隊(duì)列、二叉樹等。在實(shí)現(xiàn)過(guò)程中,需要考慮數(shù)據(jù)結(jié)構(gòu)的初始化、增刪改查等基本操作,并且保證數(shù)據(jù)結(jié)構(gòu)的穩(wěn)定性和高效性。


4. 實(shí)驗(yàn)算法的設(shè)計(jì)與應(yīng)用


在實(shí)驗(yàn)過(guò)程中,需要設(shè)計(jì)和實(shí)現(xiàn)與數(shù)據(jù)結(jié)構(gòu)相關(guān)的算法。例如,在鏈表中查找指定元素、在二叉樹中進(jìn)行遍歷等。這些算法可以通過(guò)遞歸、循環(huán)等方式實(shí)現(xiàn),需要根據(jù)具體問(wèn)題來(lái)選擇最優(yōu)解。


5. 實(shí)驗(yàn)數(shù)據(jù)的測(cè)試與分析


實(shí)現(xiàn)完成后,需要針對(duì)不同的數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行測(cè)試。通過(guò)不同規(guī)模和類型的數(shù)據(jù)進(jìn)行性能測(cè)試,分析不同數(shù)據(jù)結(jié)構(gòu)和算法的運(yùn)行效率和空間復(fù)雜度。并且對(duì)實(shí)驗(yàn)結(jié)果進(jìn)行詳細(xì)的分析和總結(jié)。


四、實(shí)驗(yàn)結(jié)果與分析


在本次實(shí)驗(yàn)中,基于C++語(yǔ)言實(shí)現(xiàn)了鏈表、棧、隊(duì)列、二叉樹等數(shù)據(jù)結(jié)構(gòu),并設(shè)計(jì)了相關(guān)的算法進(jìn)行測(cè)試。通過(guò)實(shí)驗(yàn)數(shù)據(jù)的測(cè)試與分析,得出了以下:


1. 在數(shù)據(jù)規(guī)模較小的情況下,各個(gè)數(shù)據(jù)結(jié)構(gòu)的性能相差不大,但隨著數(shù)據(jù)規(guī)模的增大,鏈表和隊(duì)列的性能表現(xiàn)更好。


2. 在需要頻繁插入和刪除數(shù)據(jù)的場(chǎng)景中,鏈表和隊(duì)列的效率明顯高于其他數(shù)據(jù)結(jié)構(gòu)。


3. 在需要高效搜索和排序的場(chǎng)景中,二叉樹的性能最好,具有較快的搜索速度和高效的排序能力。


五、實(shí)驗(yàn)總結(jié)


通過(guò)本次實(shí)驗(yàn),加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解和應(yīng)用,熟練掌握了常見(jiàn)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)和算法設(shè)計(jì)。同時(shí),也發(fā)現(xiàn)了不同數(shù)據(jù)結(jié)構(gòu)在不同場(chǎng)景下的優(yōu)勢(shì)和劣勢(shì),這將對(duì)日后的程序設(shè)計(jì)和問(wèn)題解決有著重要的指導(dǎo)作用。


本次實(shí)驗(yàn)不僅幫助深入了解了數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用,還提高了的編程技巧和問(wèn)題解決能力。實(shí)驗(yàn)過(guò)程中的一系列操作和思考,都是今后從事軟件開發(fā)和算法設(shè)計(jì)必不可少的經(jīng)驗(yàn)。

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇6

實(shí)驗(yàn)報(bào)告;課程名稱:數(shù)據(jù)結(jié)構(gòu)班級(jí):軟件工程實(shí)驗(yàn)成績(jī):;實(shí)驗(yàn)?zāi)康?對(duì)隊(duì)列的理解;對(duì)STL中的queue的使用;實(shí)驗(yàn)仿真一個(gè)網(wǎng)絡(luò)打印過(guò)程;二、實(shí)驗(yàn)內(nèi)容與實(shí)驗(yàn)步驟流程圖;這個(gè)任務(wù)隊(duì)列的測(cè)試使用STL隊(duì)列適配器;具體地說(shuō),每一行中包含的信息是

實(shí) 驗(yàn) 報(bào) 告

課程名稱:數(shù)據(jù)結(jié)構(gòu) 班級(jí):軟件工程實(shí)驗(yàn)成績(jī):

1206

實(shí)驗(yàn)名稱:打印機(jī)隊(duì)列模擬學(xué)號(hào):20124848 批閱教師簽字:

程序的設(shè)計(jì)

實(shí)驗(yàn)編號(hào):實(shí)驗(yàn)一 姓名: 實(shí)驗(yàn)日期:2014年5 月 24 日

一、實(shí)驗(yàn)?zāi)康?/strong>

對(duì)隊(duì)列的理解

對(duì)STL中的queue的使用

實(shí)驗(yàn)仿真一個(gè)網(wǎng)絡(luò)打印過(guò)程

二、實(shí)驗(yàn)內(nèi)容與實(shí)驗(yàn)步驟流程圖

這個(gè)任務(wù)隊(duì)列的測(cè)試使用STL隊(duì)列適配器。程序要求完成模擬的實(shí)現(xiàn)共享打印機(jī)。這個(gè)打印機(jī)使用先進(jìn)先出隊(duì)列。仿真是通過(guò)讀取和處理事件數(shù)據(jù)文件的`列表。一個(gè)有效的數(shù)據(jù)文件中的每一行包含信息打印作業(yè)和提交這份工作的時(shí)間。

具體地說(shuō),每一行中包含的信息是提交工作的時(shí)間(以秒為單位),和在頁(yè)面的工作長(zhǎng)及工作的計(jì)算機(jī)的名稱。在模擬的開始,每個(gè)這些事件的每一個(gè)應(yīng)該被程序所讀,存儲(chǔ)在繼承工作負(fù)載隊(duì)列。程序應(yīng)該通過(guò)循環(huán)遞增計(jì)數(shù)器或while-loop模擬時(shí)間的流逝。程序應(yīng)該將計(jì)數(shù)器初始化為零,然后依次增加1秒。當(dāng)模擬等于當(dāng)前時(shí)間的打印作業(yè)的提交時(shí)間在工作隊(duì)列的前面,一個(gè)打印作業(yè)完成。當(dāng)這一切發(fā)生的時(shí)候,從工作隊(duì)列取出這個(gè)事件,然后把它放在另一個(gè)隊(duì)列對(duì)象。這個(gè)隊(duì)列對(duì)象存儲(chǔ)已完成的打印作業(yè)。當(dāng)程序仿真其他的打印工作的時(shí)候,這些工作在隊(duì)列等待。

Win8,Visual C++ 6.0

四、實(shí)驗(yàn)過(guò)程與分析

(1)實(shí)驗(yàn)主要函數(shù)及存儲(chǔ)結(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)實(shí)驗(yàn)代碼

#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();

}

五、實(shí)驗(yàn)結(jié)果總結(jié)

經(jīng)測(cè)試,功能較為完整。代碼流程簡(jiǎn)圖如下:

通過(guò)這次實(shí)驗(yàn),我了解了有關(guān)隊(duì)列方面的知識(shí)。掌握了隊(duì)列的邏輯結(jié)構(gòu),抽象數(shù)據(jù)類型,隊(duì)列的存儲(chǔ)方式等。運(yùn)用先進(jìn)先出表,仿真了網(wǎng)絡(luò)打印隊(duì)列。這都使我對(duì)數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)有了新的認(rèn)識(shí)與幫助。在實(shí)驗(yàn)過(guò)程中,我也遇到了許多困難,從開始時(shí)對(duì)隊(duì)列運(yùn)算的不熟悉,到逐漸查找資料,從而完成了實(shí)驗(yàn);六、附錄;-《數(shù)據(jù)結(jié)構(gòu)與算法分析》以及網(wǎng)上資料;

逐漸查找資料,從而完成了實(shí)驗(yàn)。在今后的學(xué)習(xí)中,我將繼續(xù)努力,加強(qiáng)對(duì)堆棧,隊(duì)列等知識(shí)的學(xué)習(xí),以達(dá)到精益求精。

六、附錄

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇7

1)掌握棧和隊(duì)列這兩種特殊的線性表,熟悉它們的特性,在實(shí)際問(wèn)題背景下靈活運(yùn)用它們。

本實(shí)驗(yàn)訓(xùn)練的要點(diǎn)是“?!焙汀瓣?duì)列”的觀點(diǎn);

1) 利用棧,實(shí)現(xiàn)數(shù)制轉(zhuǎn)換。

2) 利用棧,實(shí)現(xiàn)任一個(gè)表達(dá)式中的語(yǔ)法檢查(選做)。

3) 編程實(shí)現(xiàn)隊(duì)列在兩種存儲(chǔ)結(jié)構(gòu)中的基本操作(隊(duì)列的初始化、判隊(duì)列空、入隊(duì)列、出隊(duì)列);

順序棧:

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)//上面一個(gè)...

{

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(“括號(hào)匹配成功!nn”);

break;

printf(“沒(méi)有滿足條件n”);

flag=FALSE;

}

break;

break;

break;

}

}

if (flag && x=='#' && StackEmpty(S))

return ERROR;

}

鏈隊(duì)列:

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; //只有一個(gè)元素時(shí)(不存在指向尾指針)

free (p);

return OK;

}

Status QueueTraverse(LinkQueue Q)

{

QueuePtr p,q;

{

printf(“這是一個(gè)空隊(duì)列!n”);

return ERROR;

}

p=Q.front->next;

{

q=p;

printf(“%ddata);

q=p->next;

p=q;

}

return OK;

}

循環(huán)隊(duì)列:

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(“這是一個(gè)空隊(duì)列!”);

Q.front++;

}

return OK;

}

數(shù)據(jù)結(jié)構(gòu)報(bào)告 篇8

數(shù)據(jù)結(jié)構(gòu)報(bào)告

引言:

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)中的一門重要課程,它研究如何組織和存儲(chǔ)數(shù)據(jù),以便在計(jì)算機(jī)中高效地操作和處理。數(shù)據(jù)結(jié)構(gòu)對(duì)于計(jì)算機(jī)科學(xué)的發(fā)展和應(yīng)用起著至關(guān)重要的作用。本報(bào)告將詳細(xì)介紹數(shù)據(jù)結(jié)構(gòu)的相關(guān)主題,包括數(shù)組、鏈表、棧、隊(duì)列和樹等。

一、數(shù)組

數(shù)組是一種線性數(shù)據(jù)結(jié)構(gòu),它由相同類型的元素組成,并按照一定的順序存儲(chǔ)在內(nèi)存中。數(shù)組提供了按下標(biāo)隨機(jī)訪問(wèn)元素的能力,具有快速讀取和修改元素的特點(diǎn)。本節(jié)將介紹數(shù)組的定義、基本操作及其在實(shí)際應(yīng)用中的使用。

二、鏈表

鏈表是另一種常見(jiàn)的線性數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)和指向下一個(gè)節(jié)點(diǎn)的指針。與數(shù)組相比,鏈表的插入和刪除操作更加靈活,但訪問(wèn)元素時(shí)需要遍歷整個(gè)鏈表。本節(jié)將介紹鏈表的分類、基本操作以及它在實(shí)際應(yīng)用中的應(yīng)用場(chǎng)景。

三、棧

棧是一種具有特殊操作規(guī)則的線性數(shù)據(jù)結(jié)構(gòu),它遵循先進(jìn)后出(Last In First Out,LIFO)的原則。棧主要包含入棧和出棧兩個(gè)基本操作,可以用于實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器、函數(shù)調(diào)用等。本節(jié)將介紹棧的定義、基本操作以及它在計(jì)算機(jī)系統(tǒng)中的應(yīng)用。

四、隊(duì)列

隊(duì)列是一種具有特殊操作規(guī)則的線性數(shù)據(jù)結(jié)構(gòu),它遵循先進(jìn)先出(First In First Out,F(xiàn)IFO)的原則。隊(duì)列主要包含入隊(duì)和出隊(duì)兩個(gè)基本操作,可以用于實(shí)現(xiàn)線程池、消息隊(duì)列等。本節(jié)將介紹隊(duì)列的定義、基本操作以及它在實(shí)際應(yīng)用中的使用。

五、樹

樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),由節(jié)點(diǎn)和邊組成,節(jié)點(diǎn)之間存在層次關(guān)系。樹具有層次性、唯一根節(jié)點(diǎn)和子樹的遞歸結(jié)構(gòu)等特點(diǎn)。樹的應(yīng)用非常廣泛,比如文件系統(tǒng)、數(shù)據(jù)庫(kù)索引和圖像壓縮等。本節(jié)將介紹樹的定義、基本概念以及常見(jiàn)的樹結(jié)構(gòu)和它們的應(yīng)用場(chǎng)景。

六、總結(jié)

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)科學(xué)的基礎(chǔ),它為我們提供了有效存儲(chǔ)和操作數(shù)據(jù)的方法。通過(guò)本報(bào)告的詳細(xì)介紹,我們了解了數(shù)組、鏈表、棧、隊(duì)列和樹等常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),以及它們?cè)趯?shí)際應(yīng)用中的使用場(chǎng)景。在實(shí)際開發(fā)中,根據(jù)不同的問(wèn)題需求選擇合適的數(shù)據(jù)結(jié)構(gòu)非常重要,只有熟練掌握數(shù)據(jù)結(jié)構(gòu)的原理和應(yīng)用,才能更高效地解決實(shí)際問(wèn)題。

參考文獻(xiàn):

1.《數(shù)據(jù)結(jié)構(gòu)與算法分析- C語(yǔ)言描述》

2.《數(shù)據(jù)結(jié)構(gòu)與算法分析- Java語(yǔ)言描述》

3.《Introduction to Algorithms》

附錄:數(shù)據(jù)結(jié)構(gòu)相關(guān)算法代碼實(shí)現(xiàn)及其測(cè)試用例

相信《2024數(shù)據(jù)結(jié)構(gòu)報(bào)告》一文能讓您有很多收獲!“幼兒教師教育網(wǎng)”是您了解幼師資料,工作計(jì)劃的必備網(wǎng)站,請(qǐng)您收藏yjs21.com。同時(shí),編輯還為您精選準(zhǔn)備了數(shù)據(jù)結(jié)構(gòu)報(bào)告專題,希望您能喜歡!

相關(guān)推薦

  • 數(shù)據(jù)分析報(bào)告 紙上得來(lái)終覺(jué)淺,絕知此事要躬行,在我們的學(xué)習(xí)或者工作中,寫報(bào)告是必不可少的。優(yōu)秀的報(bào)告模板有哪些?我來(lái)分享一篇網(wǎng)絡(luò)文章是關(guān)于“數(shù)據(jù)分析報(bào)告”,將這個(gè)信息分享給你的親朋好友讓大家都知道吧!...
    2024-04-28 閱讀全文
  • 數(shù)據(jù)調(diào)研報(bào)告 編輯整理了以下有關(guān)“數(shù)據(jù)調(diào)研報(bào)告”的內(nèi)容供您參考,希望這些研究能夠?yàn)槟闾峁┮恍┯幸娴囊?jiàn)解和知識(shí)。紙上得來(lái)終覺(jué)淺,絕知此事要躬行,每當(dāng)我們完成一項(xiàng)任務(wù)時(shí)。我們需要撰寫報(bào)告,作報(bào)告的側(cè)重點(diǎn)在于口頭演講匯報(bào),主要用于新聞媒體或者給群眾作報(bào)告。...
    2023-08-19 閱讀全文
  • 數(shù)據(jù)報(bào)告(精華5篇) 撰寫報(bào)告時(shí)我們可以從哪些角度著手?為了向領(lǐng)導(dǎo)更好地匯報(bào)工作,一般都會(huì)需要撰寫報(bào)告。通常報(bào)告一般由標(biāo)題、正文、結(jié)尾三部分組成,欄目小編向您推薦“數(shù)據(jù)報(bào)告”相信您一定不會(huì)失望,下面的信息僅供大家參考希望大家閱讀!...
    2024-07-31 閱讀全文
  • 統(tǒng)計(jì)數(shù)據(jù)自查報(bào)告 一般而言,只有實(shí)踐能克服經(jīng)驗(yàn)的錯(cuò)誤,不管是上學(xué)還是工作的時(shí)候。需要使用報(bào)告的情況越來(lái)越多,報(bào)告具有匯報(bào)性,主要是匯報(bào)相關(guān)工作內(nèi)容和數(shù)據(jù),報(bào)告可以從哪些方面寫好呢?為了更方便使用小編整理了“統(tǒng)計(jì)數(shù)據(jù)自查報(bào)告”類的內(nèi)容,歡迎大家一起分享自己的經(jīng)驗(yàn)和知識(shí)讓更多人受益!...
    2023-08-16 閱讀全文
  • 大數(shù)據(jù)報(bào)告系列10篇 倘若您對(duì)此議題感到困惑不解,或許可以考慮一讀《大數(shù)據(jù)報(bào)告》,它或能給出啟發(fā)。俗話說(shuō),眼見(jiàn)為實(shí),為了更具體地表述一些數(shù)據(jù),我們經(jīng)常需撰寫報(bào)告。而這些報(bào)告的內(nèi)容需要經(jīng)過(guò)深思熟慮,決不能敷衍了事。相信您能從本文中獲取所需的幫助!...
    2023-07-09 閱讀全文

紙上得來(lái)終覺(jué)淺,絕知此事要躬行,在我們的學(xué)習(xí)或者工作中,寫報(bào)告是必不可少的。優(yōu)秀的報(bào)告模板有哪些?我來(lái)分享一篇網(wǎng)絡(luò)文章是關(guān)于“數(shù)據(jù)分析報(bào)告”,將這個(gè)信息分享給你的親朋好友讓大家都知道吧!...

2024-04-28 閱讀全文

編輯整理了以下有關(guān)“數(shù)據(jù)調(diào)研報(bào)告”的內(nèi)容供您參考,希望這些研究能夠?yàn)槟闾峁┮恍┯幸娴囊?jiàn)解和知識(shí)。紙上得來(lái)終覺(jué)淺,絕知此事要躬行,每當(dāng)我們完成一項(xiàng)任務(wù)時(shí)。我們需要撰寫報(bào)告,作報(bào)告的側(cè)重點(diǎn)在于口頭演講匯報(bào),主要用于新聞媒體或者給群眾作報(bào)告。...

2023-08-19 閱讀全文

撰寫報(bào)告時(shí)我們可以從哪些角度著手?為了向領(lǐng)導(dǎo)更好地匯報(bào)工作,一般都會(huì)需要撰寫報(bào)告。通常報(bào)告一般由標(biāo)題、正文、結(jié)尾三部分組成,欄目小編向您推薦“數(shù)據(jù)報(bào)告”相信您一定不會(huì)失望,下面的信息僅供大家參考希望大家閱讀!...

2024-07-31 閱讀全文

一般而言,只有實(shí)踐能克服經(jīng)驗(yàn)的錯(cuò)誤,不管是上學(xué)還是工作的時(shí)候。需要使用報(bào)告的情況越來(lái)越多,報(bào)告具有匯報(bào)性,主要是匯報(bào)相關(guān)工作內(nèi)容和數(shù)據(jù),報(bào)告可以從哪些方面寫好呢?為了更方便使用小編整理了“統(tǒng)計(jì)數(shù)據(jù)自查報(bào)告”類的內(nèi)容,歡迎大家一起分享自己的經(jīng)驗(yàn)和知識(shí)讓更多人受益!...

2023-08-16 閱讀全文

倘若您對(duì)此議題感到困惑不解,或許可以考慮一讀《大數(shù)據(jù)報(bào)告》,它或能給出啟發(fā)。俗話說(shuō),眼見(jiàn)為實(shí),為了更具體地表述一些數(shù)據(jù),我們經(jīng)常需撰寫報(bào)告。而這些報(bào)告的內(nèi)容需要經(jīng)過(guò)深思熟慮,決不能敷衍了事。相信您能從本文中獲取所需的幫助!...

2023-07-09 閱讀全文