專題心得體會

當前位置 /首頁/心得體會/專題心得體會/列表

資料結構課程設計心得體會精品多篇

資料結構課程設計心得體會精品多篇

資料結構課程設計 篇一

《資料結構》

課程設計報告

學 號 姓 名 班 級 指導教師

XXX XXX XXX XXX 安徽工業大學計算機學院

2014年6月

利用棧實現迷宮問題的求解

一、問題描述

以一個M*N的長方陣表示迷宮,0和1分別表示迷宮中的通路和牆壁。設計一個程式,對任意設定的迷宮,求出一條從入口到出口的通路,或得出米有通路的結論。

二、設計思路

(1)以二維陣列maze[m][n]表示迷宮,陣列中元素值為0表示通路,1表示障礙。

(2)其中迷宮的入口位置和出口位置預設於maze陣列的起始元素位置和最後個元素位置。

(3)以連結串列作儲存結構的棧型別,實現求解迷宮的非遞迴程式。

三、資料結構定義 typedef struct{

int x; int y; }item; typedef struct{ int x,y,d; }DataType; typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

四、程式清單 #include#include#include#define m 6 #define n 8 int maze[m+2][n+2]={{1,1,1,1,1,1,1,1,1,1},

typedef struct{

{1,0,1,1,1,0,1,1,1,1}, {1,0,0,0,0,1,1,1,1,1}, {1,0,1,0,0,0,0,0,1,1}, {1,0,1,1,1,0,0,1,1,1}, {1,1,0,0,1,1,0,0,0,1}, {1,0,1,1,0,0,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1}}; int x; int y; }item;

item move[4]={{0,1},{1,0},{0,-1},{-1,0}};

typedef struct{ int x,y,d; }DataType;

typedef struct{ DataType data[1000]; int top; }SeqStack,*PSeqStack;

PSeqStack Init_SeqStack() {

} PSeqStack p; p=(PSeqStack)malloc(sizeof(SeqStack)); if(p) p->top=-1; return p;

int Empty_SeqStack(PSeqStack p) {

}

int Push_SeqStack(PSeqStack p,DataType x) {

}

int Pop_SeqStack(PSeqStack p,DataType *x) { if(p->top==999) return 0; if(p->top==-1) return 1; else return 0; else {

} p->top++; p->data[p->top]=x; return 1;

} if(Empty_SeqStack(p)) return 0; else {

} *x=p->data[p->top]; p->top--; return 1; void Destroy_SeqStack(PSeqStack *p) {

}

int mazepath(int maze[][n+2],item move[],int x0,int y0) {

PSeqStack S; DataType temp; int x,y,d,i,j; if(*p) free(*p); *p=NULL; return;

temp.x=x0; temp.y=y0; temp.d=-1; S=Init_SeqStack(); if(!S) {

} Push_SeqStack(S,temp); while(!Empty_SeqStack(S)) {

Pop_SeqStack(S,&temp); x=temp.x; y=temp.y; d=temp.d+1; while(d<4) {

i=x+move[d]。x; j=y+move[d]。y; if(0==maze[i][j]) { temp.x=x; printf(“棧初始化失敗!!!”); return 0;

}

}

} temp.y=y; temp.d=d; Push_SeqStack(S,temp); x=i; y=j; maze[x][y]=-1; if(x==m&&y==n) {

} else d=0; while(!Empty_SeqStack(S)) {

} Destroy_SeqStack(&S); return 1; Pop_SeqStack(S,&temp); printf(“(%d,%d)<-”,temp.x,temp.y); else d++;

} Destroy_SeqStack(&S); return 0; int main() {

}

五、執行及除錯分析 mazepath(maze,move,1,1); return 0;

六、課程設計總結等

在做實驗前,一定要將課本上的知識吃透,因為這是做實驗的基礎,否則,在做設計程式實驗時,這將使你做的難度加大,浪費寶貴的時間。使你事倍功半。做實驗時,一定要親力親為,務必要將每個步驟,每個細節弄清楚,弄明白,實驗後,還要複習,思考,這樣,你的印象才深刻,記得才牢固,否則,過後不久你就會忘得一乾二淨,這還不如不做。通過這次程式設計的實驗,使我們學到了不少實用的知識,更重要的是,做實驗的過程,思考問題的方法,這與做其他的實驗是通用的,真正使我們們受益匪淺。

大數相乘

一、問題描述

本問題中,要求輸入兩個相對較大的正整數,能夠通過程式計算出其結果

二、設計思路

1、輸入階段採用一維陣列a[],b[] 在輸入階段當大數輸入時,大數a,b從高位到低位分別依次存入陣列a[ ],b[ ]。

2、呼叫函式計算階段採用一維陣列c[ ] 在計算過程中,由個位到高位依次計算各位的結果,並依次存入陣列c[ ]中。

三、資料結構定義

int x[N],y[N],z[N*N];

四、程式清單 #include#include#define N 80 void mul(int *x,int *y,int *z) { int i,j; for(i=0;i<2*N;i++) z[i]=0; for(i=0;i

五、執行及除錯分析

六、課程設計總結。

回顧起此次課程設計,至今我仍感慨頗多,的確,從從拿到題目到完成整個程式設計,從理論到實踐,可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正提高自己的實際動手能力和獨立思考的能力。

資料結構課程設計 篇二

資料結構課程設計

1、赫夫曼編碼器

設計一個利用赫夫曼演算法的編碼和譯碼系統,重複地顯示並處理以下專案,直到選擇退出為止。 要求:

1) 將權值資料存放在資料檔案(檔名為,位於執行程式的當前目錄中)

2) 初始化:鍵盤輸入字符集大小26、26個字元和26個權值(統計一篇英文文章中26個字母),建立哈夫曼樹;

3) 編碼:利用建好的哈夫曼樹生成哈夫曼編碼;

4) 輸出編碼(首先實現螢幕輸出,然後實現檔案輸出); 5) 介面優化設計。

程式碼如下:

#include#include#include#include #define N 200

typedef struct HTNode

//結構體 { int Weight;

char ch; int Parent,Lchild,Rchild; }HTNode; typedef char * * HCode;

void Save(int n,HTNode *HT)

//把權值儲存到檔案 {

FILE * fp;

int i;

if((fp=fopen(“”,“wb”))==NULL)

{

printf(“cannot open filen”);

return;

}

for(i=0;i

if(fwrite(&HT[i]。Weight,sizeof(struct HTNode),1,fp)!=1)

printf(“file write errorn”);

fclose(fp);

system(“cls”);

printf(“儲存成功!”);

}

void Create_H(int n,int m,HTNode *HT)

//建立赫夫曼樹,進行編碼 {

int w,k,j; char c; for(k=1;k<=m;k++) {

if(k<=n)

{

printf(“n請輸入權值和字元(用空格隔開): ”);

scanf(“%d”,&w);

scanf(“ %c”,&c); HT[k]。ch=c;

HT[k]。Weight=w;

}

else HT[k]。Weight=0;

HT[k]。Parent=HT[k]。Lchild=HT[k]。Rchild=0; }

int p1,p2,w1,w2;

for(k=n+1;k<=m;k++) {

p1=0;p2=0;

w1=32767;w2=32767;

for(j=1;j<=k-1;j++)

{

if(HT[j]。Parent==0)

{

if(HT[j]。Weight

{

w2=w1;p2=p1;

w1=HT[j]。Weight;

p1=j;

}

else if(HT[j]。Weight

{

w2=HT[j]。Weight;

p2=j;

}

}

} HT[k]。Lchild=p1;HT[k]。Rchild=p2; HT[k]。Weight=HT[p1]。Weight+HT[p2]。Weight;

HT[p1]。Parent=k;HT[p2]。Parent=k;

} printf(“輸入成功!”); }

void Coding_H(int n,HTNode *HT)

//對結點進行譯碼 { int k,sp,fp,p; char *cd; HCode HC;

HC=(HCode)malloc((n+1)*sizeof(char *));

cd=(char *)malloc(n*sizeof(char)); cd[n-1]='';

printf(“************************n”); printf(“Char Codingn”);

for(k=1;k<=n;k++)

{

sp=n-1;p=k;fp=HT[k]。Parent;

for(;fp!=0;p=fp,fp=HT[fp]。Parent)

if(HT[fp]。Lchild==p)

cd[--sp]='0';

else

cd[--sp]='1';

HC[k]=(char *)malloc((n-sp)*sizeof(char));

strcpy(HC[k],&cd[sp]);

printf(“%c

%sn”,HT[k]。ch,HC[k]);

}

printf(“************************n”); free(cd) ; } void Read(int n,HTNode *HT)

//從檔案中讀出資料 {

int i; FILE * fp; if((fp=fopen(“”,“rb”))==NULL) {

printf(“cannot open filen”);

exit(0); } for(i=0;i

fread(&HT[i]。Weight,sizeof(struct HTNode),1,fp); // printf(“%d n”,HT[i]。Weight);

} Coding_H(n,HT);

fclose(fp); }

void Print_H(int m,HTNode *HT)

//輸出赫夫曼造樹過程 { int k; printf(“************************n”); printf(“Num Weight

Par LCh RCh n”); for(k=1;k<=m;k++) {

printf(“%d ”,k);

printf(“

%d”,HT[k]。Weight);

printf(“

%d”,HT[k]。Parent);

printf(“

%d”,HT[k]。Lchild);

printf(“

%dn”,HT[k]。Rchild);

} printf(“************************n”); }

void Decode(int m,HTNode *HT)

//對輸入的電文進行譯碼 { int i,j=0; char a[10]; char endflag='2'; i=m; printf(“輸入傳送的編碼,以‘2’結束:”); scanf(“%s”,&a); printf(“譯碼後的字元:”); while(a[j]!='2') {

if(a[j]=='0')

i=HT[i]。Lchild;

else i=HT[i]。Rchild;

if(HT[i]。Lchild==0)

//HT[i]是葉結點

{

printf(“%c”,HT[i]。ch);

i=m;

//回到根結點

}

j++; } printf(“n”); if(HT[i]。Lchild!=0&&a[j]!='2')

printf(“ERROR”); }

int main()

//主函式 { int n,m,c; HTNode HT[N]; do {

system(“color 2f”);

//執行環境背景顏色。

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt 赫夫曼編譯碼系統 ttt”);

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt1.輸入權值、字母nttt2.把資料寫入檔案nttt3.輸出赫夫曼編碼表nttt”);

printf(“4.輸出赫夫曼譯碼錶nttt5.輸入編碼並譯碼。nttt6.從檔案中讀出資料nttt7.退出”);

printf(“nnttt請選擇:”);

scanf(“%d”,&c);

switch(c)

{

case 1:system(“cls”);printf(“輸入多少結點:”);

scanf(“%d”,&n);m=2*n-1;Create_H(n,m,HT);break;

case 2:system(“cls”);Save(n,HT);break;

case 3:system(“cls”);Print_H(m,HT);break;

case 4:system(“cls”);Coding_H(n,HT);break;

case 5:system(“cls”);Decode(m,HT);break;

case 6:system(“cls”);Read(n,HT);break;

case 7:system(“cls”);exit(0);

}

}while(1); return 0; }

執行介面如下:

2、學生成績管理(連結串列實現) 要求:

實現如下功能:增加、查詢、刪除、輸出、退出。

程式碼如下:

#include#include#includetypedef struct score

//定義成績資訊結構體 {

char Number[20]; char Name[20]; char Chinese[20]; char English[20]; char Math[20]; }score; typedef struct node_score

//定義成績資訊連結串列結點,包括資料域和指標域 {

score data; struct node_score *next; }node_score,*p_node_score; p_node_score headScore;//定義連結串列的頭指標為全域性變數 void PrintScore(score s) //輸出資訊函式 { printf(“ %10s”,er); printf(“ |

%-6s”,); printf(“

|

%-3s”,ese); printf(“

|

%-3s”,ish);

printf(“ |

%-3sn”,); } void View()//輸出函式 {

p_node_score pNodeScore;

pNodeScore=headScore; printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”); while(pNodeScore != NULL) {

PrintScore(pNodeScore->data);//輸出學生資訊和成績資訊

pNodeScore=pNodeScore->next; } } void Add() {

p_node_score pNodeScore; // 定義一個節點

pNodeScore=(p_node_score)malloc(sizeof(node_score));//為節點分配儲存空間

printf(“請輸入學號:”); scanf(“%s”,pNodeScore->er); printf(“請輸入姓名:”); scanf(“%s”,pNodeScore->); printf(“請輸入語文成績:”); scanf(“%s”,pNodeScore->ese); printf(“請輸入英語成績:”); scanf(“%s”,pNodeScore->ish); printf(“請輸入高數成績:”); scanf(“%s”,pNodeScore->); if(headScore==NULL) { //如果頭結點為空

headScore=pNodeScore;

pNodeScore->next=NULL; } else

{ //如果頭結點不為空

pNodeScore->next=headScore;

headScore=pNodeScore;//將頭結點新結點

} } void Input() { int n,i; printf(“輸入幾個學生的資料:”); scanf(“%d”,&n); for(i=0;i

Add(); printf(“輸入成功!”); } int Delete() { p_node_score pNodeScore,p1; //p1為pNodeScore的前驅

p1=headScore; if(p1==NULL) {

printf(“成績表中沒有資料!請先新增資料!n”);

return 0; } char DeleteNumber[20];

printf(“請數入要刪除的學生學號:”); scanf(“%s”,DeleteNumber); if(strcmp(p1->er,DeleteNumber)==0)

{ //如果要刪除的結點在第一個

headScore=p1->next;

pNodeScore=p1;

printf(“學號為%s的學生資訊已經刪除!n”,DeleteNumber);

return 0; } else

{

pNodeScore=p1->next;

while(pNodeScore!=NULL)

{

if(strcmp(pNodeScore->er,DeleteNumber)==0)

{

p1->next=pNodeScore->next;

printf(“學號為%s的學生資訊已經刪除!n”,DeleteNumber);

return 0;

}

else

{ //否則,結點向下一個,p1仍為pNodeScore的前驅

p1=pNodeScore;

pNodeScore=pNodeScore->next;

}

} } printf(“沒有此學號的學生!”); } int Change() {

p_node_score pNodeScore;

pNodeScore=headScore; if(pNodeScore==NULL) {

printf(“成績表中沒有資料!請先新增資料!n”);

return 0; } char EditNumber[20]; printf(“請輸入你要修改的學生學號:”); scanf(“%s”,EditNumber); while(pNodeScore!=NULL) {

if(strcmp(pNodeScore->er,EditNumber)==0)

{ //用strcmp比較兩字串是否相等,相等則返回0

printf(“原來的學生成績資訊如下:n”); //輸出原來的成績資訊

printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”);

PrintScore(pNodeScore->data);

printf(“語文新成績:”);

scanf(“%s”,pNodeScore->ese);

printf(“英語新成績:”);

scanf(“%s”,pNodeScore->;

printf(“高數新成績:”);

scanf(“%s”,pNodeScore->);

printf(“成績已經修改!”);

return 0;

}

pNodeScore=pNodeScore->next; //如果不相等,pNodeScore則指向下一個結點

} printf(“沒有此學號的學生!n”); //如果找到最後都沒有,則輸出沒有此學號的學生

} int Find() {

p_node_score pNodeScore;

pNodeScore=headScore; if(pNodeScore==NULL) {

printf(“成績表中沒有資料!請先新增資料!n”);

return 0; } char FindNumber[20]; printf(“請輸入你要查詢的學生學號:”); scanf(“%s”,FindNumber); while(pNodeScore!=NULL) {

if(strcmp(pNodeScore->er,FindNumber)==0)

{

printf(“你要查詢的學生成績資訊如下:n”);

printf(“

學號

|

姓名

| 語文成績

| 英語成績| 高數成績n”);

PrintScore(pNodeScore->data);

return 0;

}

pNodeScore=pNodeScore->next; } printf(“沒有此學號的學生!n”); } int main()

//主函式 { int choice=0; headScore=NULL; int c; do {

system(“color 2f”);

//執行環境背景顏色。

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt 學生成績管理系統 ttt”);

printf(“nntt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=ntt”);

printf(“nttt1.輸入成績資訊nttt2.輸出成績資訊nttt3.新增成績資訊nttt”);

printf(“4.修改成績資訊nttt5.刪除成績資訊nttt6.查詢成績資訊nttt7.退出”);

printf(“nnttt請選擇:”);

scanf(“%d”,&c);

switch(c)

{

case 1:system(“cls”);Input();break;

case 2:system(“cls”);View();break;

case 3:system(“cls”);Add();break;

case 4:system(“cls”);Change();break;

case 5:system(“cls”);Delete();break;

case 6:system(“cls”);Find();break;

case 7:system(“cls”);exit(0);

}

}while(1); return 0; }

執行介面如下:

資料結構課程設計心得體會 篇三

本次課程設計所用到的知識完全是上學期的知識,通過這次課程設計,我認識到了我對資料結構這門課的掌握程度。

首先我這個課程設計是關於二元樹的,由於是剛接觸二元樹,所以我掌握的長度並不深。在程式設計之前我把有關於二元樹的知識有溫習了一遍,還好並沒有忘掉。二元樹這章節難度中上等,而且內容廣泛,所以我只掌握了百分之六七十。

然後,在程式設計中我認識到了自己動手能力的不足,雖然相比較大二而言進步很大,但是我還是不滿意,有的在程式設計中必須看書才能寫出來,有的靠百度,很少是自己寫的。還好,我自己組裝程式的能力還行,要不這東拼西湊的程式根本組裝不了。在程式設計中我還認識到了,程式設計不能停下,如果程式設計的時間少了,知識忘的會很快,而且動手也會很慢。同時,同學之間的合作也很重要,每個人掌握的知識都不一樣,而且掌握程度也不一樣,你不會的別的同學會,所以在大家的共同努力下,程式設計會變得很容易。在這次程式設計中,我瞭解到了自己某些方面的不足,比如說連結串列的知識,雖然我能做一些有關於連結串列的程式設計,但是很慢,沒有別人程式設計的快,另外,二元樹和圖的知識最不好掌握,這方面的知識廣泛而複雜。以前,沒動手程式設計的時候覺得這些知識很容易,現在程式設計了才發現自己錯了,大錯特錯了,我們這個專業最重視的就是動手程式設計能力,如果我們紙上寫作能力很強而動手程式設計能力很差,那我們就白上這個專業了。計算機這個專業就是鍛鍊動手程式設計能力的,一個人的理論知識再好,沒有動手程式設計能力,那他只是一個計算機專業的“入門者”。在程式設計中我們能找到滿足,如果我們自己程式設計了一個程式,我們會感到自豪,而且充實,因為如果我們專研一個難得程式,我們會達到忘我的境界,自己完全沉浸在程式設計的那種樂趣之中,完全會廢寢忘食。程式設計雖然會乏味很無聊,但是隻要我們沉浸其中,你就會發現裡面的樂趣,遇到難得,你會勇往直前,不寫出來永不罷休;遇到容易的,你會找到樂趣。程式設計是很乏味,但是那是因為你沒找到程式設計重的樂趣,你只看到了他的不好,而沒有看到他的好。其實,只要你找到程式設計中得樂趣,你就會完全喜歡上他,不程式設計還好,一程式設計你就會變成一個兩耳不聞窗外事的“植物人”。可以說只要你涉及到了計算機,你就的會程式設計,而且還要喜歡上他,永遠和他打交道,我相信在某一天,我們一定會把他當作我們不可或缺的好朋友。

資料結構課程設計心得體會 篇四

本次課程設計,使我對《資料結構》這門課程有了更深入的理解。我的課程設計題目是線索二元樹的運算。剛開始做這個程式的時候,感到完全無從下手,甚至讓我覺得完成這次程式設計根本就是不可能的,於是開始查閱各種資料以及參考文獻,之後便開始著手寫程式,寫完執行時有很多問題。特別是實現線索二元樹的刪除運算時很多情況沒有考慮周全,經常執行出現錯誤,但通過同學間的幫助最終基本解決問題。

在本課程設計中,我明白了理論與實際應用相結合的重要性,並提高了自己組織資料及編寫大型程式的能力。培養了基本的、良好的程式設計技能以及合作能力。這次課程設計同樣提高了我的綜合運用所學知識的能力。並對VC有了更深入的瞭解。《資料結構》是一門實踐性很強的課程,上機實習是對學生全面綜合素質進行訓練的一種最基本的方法,是與課堂聽講、自學和練習相輔相成的、必不可少的一個教學環節。上機實習一方面能使書本上的知識變“活”,起到深化理解和靈活掌握教學內容的目的;另一方面,上機實習是對學生軟體設計的綜合能力的訓練,包括問題分析,總體結構設計,程式設計基本技能和技巧的訓練。此外,還有更重要的一點是:機器是比任何教師更嚴厲的檢查者。因此,在“資料結構”的學習過程中,必須嚴格按照老師的要求,主動地、積極地、認真地做好每一個實驗,以不斷提高自己的程式設計能力與專業素質。

通過這段時間的課程設計,我認識到資料結構是一門比較難的課程。需要多花時間上機練習。這次的程式訓練培養了我實際分析問題、程式設計和動手能力,使我掌握了程式設計的基本技能,提高了我適應實際,實踐程式設計的能力。

總的來說,這次課程設計讓我獲益匪淺,對資料結構也有了進一步的理解和認識。

資料結構課程設計心得體會 篇五

通過兩週的課程設計,完成了預定的目標,其中有很多的隨想。老師的題目發下來的很早,大概提前了3周,當時就著手搜尋有關線索二元樹的思想,思路,借了一本《資料結構-c語言描述》,在大體上就有了一個輪廓,先是輸入二元樹,在對二元樹進行線索化,依次往下,但在具體實現時,遇到了很多問題:首先是思想的確定,其非常重要,以前有了這個想法,現在愈加清晰起來,因此,花了大量的時間在插入刪除的具體操作設計上,大概三個晚上的時間,對其中什麼不清晰明確之處均加以推敲,效果是顯著的,在上機上相應的節約了時間。

通過具體的實驗編碼,思路是對的,但是在小問題上摔了一次又一次,大部分時間都是花在這方面,這個節點沒傳過來啊之類的,以後應該搞一個小冊子,記錄一些錯誤的集合,以避免再犯,思想與C語言聯絡起來,才是我們所需要的,即常說的理論與實踐的關係。

資料結構是基礎的一門課,對於有過程式設計經驗的人,結合自己的程式設計體會去悟它的思想;而且我覺得隨著程式設計經歷的豐富對它的體會越深入,最初接觸是對一些思想可能只是生硬的記憶,隨著學習的深入逐漸領悟了很多。看了這次課程設計的題目,雖然具體要求沒有看清,但是總結一下,可以看出,其需要我們能把一個具體案例或一件事情反映為程式來表達,資料結構就是橋樑,通過自己的設計,使應用能力得以融匯,對與問題,具有了初步的分析,繼而解決之的能力,感覺對以後的學習會有很大的`幫助,學習無非是用於實踐。

認識到自己的不足,希望能有進一步的發展。

資料結構課程設計 篇六

一,課程題目

(算符優先法計算算數表示式)以字元序列的形式從終端輸入語法正確的、不含變數的整數表示式。利用教材表3.1(P53)給出的算符優先關係,實現對於算術四則混合運算(加、減、乘、除)表示式的求值。例如:7+(4-2)*3+12/2=19。注:按照四捨五入的方式將四則運算結果取整。

二,程式設計思想

在程式中分別設立一個運算子棧(OPTR 棧),用於儲存‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用於判斷算術表示式結束),和一個運算元棧(OPND 棧),用於存放整數,輸入算式後,先將數字與運算子分開入i棧,若為數字則先用轉換函式將char型別的數轉換為int型並進入運算元棧,若為運算子則根據教材表3.1(P53)給出的算符優先順序關係,判斷棧頂運算子和從鍵盤取得的運算子作優先順序比較,若取得的運算子優先順序高則進棧,直到取得運算子優先順序低的,則將運算元取出作operate運算後存入棧頂,反覆操作知道遇到‘#’,則結束運算,輸出棧頂元素即為結果。 三,程式流程

四,程式關鍵程式碼設計

本次程式設計共呼叫了12個方法分別是:

InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。 其中

ParseInt方法

int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10 *number[3]+number[4]; return i; } 為將輸入的數字字元型轉換為整型的轉換函式,通過Ascall表的轉換關係,將輸入的字元型數字轉換為整型。在入棧前進行此方法,以便整型數的計算。 Preced,Operate函式

char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } 其中preced是判定運算子棧的棧頂運算子C1與讀入的運算子C2之間優先關係函式;Opearte為進行二元運算aCb的函式,如果是編譯表示式,則產生這個運算的一組相應的指令並返回存放結果的中間變數名;如果是解釋執行表示式,則直接進行該運算,並返回運算結果。 五,程式原始碼以及執行結果

#include#include #includetypedef struct{ int *base; int *top; int Stacksize; }SqlNum; void InitNumStack(SqlNum &S){ =(int *)malloc(100*sizeof(int)); =; ksize=100; } int ParseInt(char c[]){ int number[5],i; for(i=0;i<5;i++){

number[i]=(int)(c[i])-48; } i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4]; return i; } void PushNum(SqlNum &S,int c){ *=c; ++; } int PopNum(SqlNum &S){ int c; --; c=*; return c; } typedef struct{ char *base; char *top; int Stacksize; }SqlCal; void InitCalStack(SqlCal &S){ =(char *)malloc(100*sizeof(char)); =; ksize=100; } void PushCal(SqlCal &S,char c){ *=c; ++; } char PopCal(SqlCal &S){ char c; --; c=*; return c; }

int In(char c,char s[]){ int i; for(i=0;i

if(c==s[i])

return 1;

return 0; }

char GetTopCal(SqlCal &s){ char c; c=*(-1); return c; } int GetTopNum(SqlNum &s){ int c; c=*(-1); return c; } char Preced(char a , char b){ char c[7]={'+','-','*','/','(',')','#'}; char d[7][7]={ {'>','>','<','<','','>'}, {'>','>','<','<','','>'}, {'>','>','>','>','','>'}, {'>','>','>','>','','>'}, {'<','<','<','<','','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='}, }; if(a=='+'){

if(b=='+'){

return d[0][0];}

if(b=='-'){

return d[0][1];}

if(b=='*'){

return d[0][2];}

if(b=='/'){

return d[0][3];}

if(b=='('){

return d[0][4];}

if(b==')'){

return d[0][5];}

if(b=='#'){

return d[0][6];} } if(a=='-'){

if(b=='+'){

return d[1][0];}

if(b=='-'){

return d[1][1];}

if(b=='*'){

return d[1][2];}

if(b=='/'){

return d[1][3];}

if(b=='('){

return d[1][4];}

if(b==')'){

return d[1][5];}

if(b=='#'){

return d[1][6];} } if(a=='*'){

if(b=='+'){

return d[2][0];}

if(b=='-'){

return d[2][1];}

if(b=='*'){

return d[2][2];}

if(b=='/'){

return d[2][3];}

if(b=='('){

return d[2][4];}

if(b==')'){

return d[2][5];}

if(b=='#'){

return d[2][6];} } if(a=='/'){

if(b=='+'){

return d[3][0];}

if(b=='-'){

return d[3][1];}

if(b=='*'){

return d[3][2];}

if(b=='/'){

return d[3][3];}

if(b=='('){

return d[3][4];}

if(b==')'){

return d[3][5];}

if(b=='#'){

return d[3][6];} } if(a=='('){

if(b=='+'){

return d[4][0];}

if(b=='-'){

return d[4][1];}

if(b=='*'){

return d[4][2];}

if(b=='/'){

return d[4][3];}

if(b=='('){

return d[4][4];}

if(b==')'){

return d[4][5];}

if(b=='#'){

return d[4][6];} } if(a==')'){

if(b=='+'){

return d[5][0];}

if(b=='-'){

return d[5][1];}

if(b=='*'){

return d[5][2];}

if(b=='/'){

return d[5][3];}

if(b=='('){

return d[5][4];}

if(b==')'){

return d[5][5];}

if(b=='#'){

return d[5][6];} } if(a=='#'){

if(b=='+'){

return d[6][0];}

if(b=='-'){

return d[6][1];}

if(b=='*'){

return d[6][2];}

if(b=='/'){

return d[6][3];}

if(b=='('){

return d[6][4];}

if(b==')'){

return d[6][5];}

if(b=='#'){

return d[6][6];} } return 0; } int Operate (int a,char theta,int b){ int c ; if (theta=='+'){

c=a+b; return c; } if (theta=='-'){

c=a-b; return c; } if (theta=='*'){

c=a*b; return c; } if (theta=='/'){

c=a/b; return c; } return 0; } void main(){ SqlCal OPTR; SqlNum OPND; char c,d[5]={'0','0','0','0','0'}; int f=0; char op[]={'+','-','*','/','(',')','#'}; InitCalStack(OPTR); InitNumStack(OPND); printf(“請輸入算式並在尾部新增一個#號n”); c=getchar(); PushCal(OPTR,'#'); while(c!='#'||GetTopCal(OPTR)!='#') { if (!In(c,op))

{

d[0]=d[1];

d[1]=d[2];

d[2]=d[3];

d[3]=d[4];

d[4]=c;

c=getchar(); f=1;

}

else

{

if(f==1){

PushNum(OPND,ParseInt(d));

d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0';

f=0;

}

switch(Preced(GetTopCal(OPTR),c))

{

case'<':

PushCal(OPTR,c);

c=getchar();

break;

case'=':

PopCal(OPTR);

c=getchar();

break;

case'>':

char theta;int a;int b;

theta=PopCal(OPTR);

b=PopNum(OPND);

a=PopNum(OPND);

PushNum(OPND,Operate(a,theta,b));

break;

}

} } printf(“%dn”,GetTopNum(OPND)); }

程式執行結果: 六,心得體會

通過這次程式設計,我發現很多程式設計過程中的不足與問題,很多問題由於考慮不全面,導致程式執行失敗。還有一些小問題,比如字母的大小寫,括號的遺漏,語法書寫錯誤等等一些基礎錯誤,也是讓我體會很深寫程式要謹慎仔細。

資料結構課程設計心得體會 篇七

通過本次課程設計,對圖的概念有了一個新的認識,在學習離散數學的時候,總覺得圖是很抽象的東西,但是在學習了《資料結構與演算法》這門課程之後,我慢慢地體會到了其中的奧妙,圖能夠在計算機中存在,首先要捕捉他有哪些具體化、數字化的資訊,比如說權值、頂點個數等,這也就說明了想要把生活中的資訊轉化到計算機中必須用數字來完整的構成一個資訊庫,而圖的存在,又涉及到了頂點之間的聯絡。圖分為有向圖和無向圖,而無向圖又是有向圖在權值雙向相等下的一種特例,如何能在計算機中表示一個雙向權值不同的圖,這就是一件很巧妙的事情,經過了思考和老師同學的幫助,我用edges[i][j]=up和edges[j][i]=up就能實現了一個雙向圖資訊的儲存。對整個程式而言,Dijkstra演算法始終都是核心內容,其實這個演算法在實際思考中並不難,也許我們誰都知道找一個路徑最短的方法,及從頂點一步一步找最近的路線並與其直接距離相比較,但是,在計算機中實現這麼一個很簡單的想法就需要涉及到很多專業知識,為了完成設計,在前期工作中,基本都是以學習C語言為主,所以浪費了很多時間,比如說在程式中,刪除頂點和增加頂點的模組中都有和建圖模組相互重複的函式,但是由於技術的原因,只能做一些很累贅的函式,可見在呼叫知識點,我沒有掌握好。不過,有了這次課程設計的經驗和教訓,我能夠很清楚的對自己定一個合適的水平,而且在這次課程設計中我學會了運用兩個新的函式sprintf和包涵在#include標頭檔案中的輸入函式。因為課程設計的題目是求最短路徑,本來是想通過演算法的實現把這個程式與交通情況相連,但是因為來不及查詢各地的資訊,所以,這個計劃就沒有實現,我相信在以後有更長時間的情況下,我會做出來的。