資料結構實驗 表示式求值

2022-09-20 06:12:03 字數 2909 閱讀 5519

資料結構實驗

棧的應用——算術表示式求值

張雷2023年4月11日

實驗目的:

1. 掌握棧的特性和基本演算法。

2. 學習利用資料結構解決實際問題的方法。

問題描述:

表示式求值:計算乙個合法的算術表示式(含四則運算、小括號和正的浮點數)的值。若實驗1已完成了多項式的四則運算,則可以改為計算乙個多項式表示式(運算元替換為多項式)的結果,可以只考慮除法能除盡的情況。

實驗內容:

1.子函式解釋:

voidinitstack_f(sqstack_f*s)

voidinitstack_f(sqstack_f*s)

//構造乙個儲存實型(字元型)的空棧,預設空間為100,分配失敗就退出

voidgettop_f(sqstack_f*s,float*e)

voidgettop_c(sqstack_c*s,char*e)

//若棧s不空,則以e帶值返棧頂元素,否則顯示錯誤「error」,並退出程式

voidpush_f(sqstack_f*s,floate)

voidpush_c(sqstack_c*s,chare)

//在s的棧頂插入新的棧頂元素e,若棧的當前空間已滿,則追加儲存空間

voidpop_f(sqstack_f*s,float*e)

voidpop_c(sqstack_c*s,char*e)

//若棧s不空,則刪除棧s的棧頂元素,用e帶值返回,否則退出程式

2.主要演算法解釋

(一)判斷運算子優先順序的演算法:

算符間的優先關係如下:

(二)中綴表示式轉換為字尾表示式的演算法:

演算法過程描述:

1) 首先將左括號「(」壓進棧,作為棧底元素;

2) 從左而右對算數表示式進行掃瞄,每次讀入乙個字元s1[i];

3) 若遇到數字或小數點,則立即寫入s2[i],若遇算數運算子,將「 」(空格)寫入s2[i];

4) 遇到左括號「(」則壓棧;

5) 若遇算術運算子,如果它們的優先順序比棧頂元素高,則直接進棧,否則彈出棧頂元素輸出到s2[i],直到新棧頂元素的優先順序比它低,然後將它壓棧;

6) 若遇到右括號「)」,則將棧頂元素輸出到s2[i],直到棧頂元素為「(」,然後相互抵消;

7) 當掃瞄到「#」符號,表明表示式串已全部輸入,將棧中的運算子全部輸出到s2[i],並刪除棧頂元素。

(三)表示式求值運算的演算法:

演算法描述:

1) 讀入無括號的字尾表示式;

2) 若為數值和小數點則將其聯合轉換為浮點型後進棧(存放運算元);

3) 若為運算子,讓棧頂元素和次頂元素與次運算子進行相應的運算,運算結果列印並進棧;

4) 重複2)3)步驟,直到輸入為「#」,則此時棧中的結果便是所追求的表示式的值。

數值轉換為實數的演算法描述:

1) 若為數字,則將其減去'0'的ascii碼後就得到該數的數值,並暫存於乙個變數m上;

2) 若繼續為數字,也將其減去'0'的ascii碼後就得到該數的數值,並將其值加上已存的m*10後的值再存於m;

3) 重複2)步驟直到遇到小數點,從小數點後的數開始,在重複2)步驟的通知,也記下小數點後的位數n;

4) 當遇到「 」(空格)後,即表示此輪需轉換的數已讀入完畢,則將m除以10的你次方,則此時的之記為轉換後的實數。

(四)主程式解釋

int main()

printf("\n\n感謝你的使用!\n\n");

return 0;

}實驗結果:

輸入「1+2*2.5+3*(2+2^2)#」,結果為14,正確;

輸入「3/(2.5+0.5)-1.3#」,結果為 -0.3,正確;

輸入「2+3*2.5-7.2/2#」,結果為 5.9,正確;

……討論總結:

再設計除法運算的演算法時,忘記了除數為0的情況,在助教師兄檢查時發現了這個問題,最後改好了,這說明設計演算法一定要注意細節,最後要感謝助教師兄的熱心幫忙!

附源**:

#include<>

#include<>

#include<>

#define ttack_init_size 100

#define stackincrement 10

typedef structsqstack_f;

typedef struct

sqstack_c;

void initstack_f(sqstack_f *s)

void initstack_c(sqstack_c *s)

void gettop_f(sqstack_f *s,float *e)

*e=*(s->top-1);

}void gettop_c(sqstack_c *s,char *e)

*e=*(s->top-1);

}void push_f(sqstack_f *s,float e)

s->top=s->base+s->stacksize;

s->stacksize+=stackincrement;

} *s->top++=e;

}void push_c(sqstack_c *s,char e)

s->top=s->base+s->stacksize;

s->stacksize+=stackincrement;

} *s->top++=e;

}void pop_f(sqstack_f *s,float *e)

void pop_c(sqstack_c *s,char *e)

int precede(char top_char,char s1_char)

if(pre[0]>=pre[1]) return 1;

else return 0;

}void translate(char *s1)

else switch(s1[i]) {

資料結構算術表示式求值實驗報告

目錄1 前言 1 2 概要設計 1 2.1 資料結構設計 1 2.2 演算法設計 1 2.3 adt描述 2 2.4 功能模組分析 2 3 詳細設計 3 3.1 資料儲存結構設計 3 3.2主要演算法流程圖 或演算法偽 3 4 軟體測試 6 5 心得體會 8 參考文獻 8 附錄 8 在計算機中,算術...

資料結構算術表示式求值課程設計

目錄1 前言 2 2 問題描述 3 3 總體設計 3 3.1 概要設計 3 3.1.1 資料結構的選擇 3 3.1.2 相關功能函式 3 3.1.3 函式模組呼叫關係 4 3.2詳細設計和編碼 5 4 執行與測試 9 4.1 上機除錯 9 4.2 演算法時間和空間效能分析 10 4.3程式執行測試結...

表示式求值

課程設計報告 課程名稱資料結構 課題名稱表示式求值 專業電腦科學與技術 班級0901 學號 200903010102 姓名覃宇星 指導教師李珍輝鄧作傑郭芳 2011年7月7日 湖南工程學院 課程設計任務書 課程名稱 c語言程式設計 課題表示式求值 專業班級計算機0901 學生姓名 學號指導老師周鐵山...