資料結構與演算法

2022-11-24 09:48:02 字數 1802 閱讀 3977

課程設計報告

目錄一.問題描述1

二.資料結構1

三.演算法設計思想及流程圖1

四.源程式2

五.測試情況6

參考文獻6

一. 問題描述

計算表示式的值(***)

問題描述:對於給定的乙個表示式,表示式中可以包括常數、算術執行符和括號,編寫程式計算表示式的值。

基本要求:從鍵盤輸入乙個正確的中綴表示式,將中綴表示式轉換為對應的字尾表示式,計算字尾表示式的值。

測試資料:任意選取乙個符合題目要求的表示式。

二. 資料結構

本程式主要採用棧的思想,運用3個函式translate、cal value和main來實現程式要求。main函式:接收乙個表示式存入str,然後呼叫translate函式和cal value函式,求得表示式的值。

translate函式:將表示式轉化為字尾表示式存入exp中,定義乙個運算子棧op,利用switch語句對數字和運算子進行判斷。運算子存入運算元棧並進行進棧出棧操作後存入exp,而數字直接存入exp。

cal value函式用來計算字尾表示式的值,定義乙個運算元棧st,利用switch進行+ - * / 四則運算,並提取運算元(witch迴圈進行湊數)。

三. 演算法設計思想及流程圖

本程式涉及到轉換和計算兩個演算法。

演算法一:轉換

(1) 若ch=『(』,則直接壓入棧底

(2) 若ch=『+』或『-』,需要解決有括號時加減的優先順序問題

(3) 若ch=『*』或『/』,需判斷優先順序,若ch與op中棧頂的『*』或『/』同級則直接發給字尾表示式,否則插入op。

(4) 若ch=『』,則忽略空格,排除誤操作。

(5) 若ch=『)』,並且op棧頂是『(』,op出棧,從而消去了兩個括號;否則『)』被解釋為級別低於其他運算子,要按上面規則進行,直到碰到『(』,op出棧。

(6) 若ch=數字,則直接發給字尾表示式,並且每乙個數字(例如:12是乙個數,不是1和2)以『#』結尾。

演算法二:計算

(1) 若ch=『+』或『-』,則將棧st中相應兩個數相加或相減,並將結果儲存在前乙個數中,然後退棧。

(2) 若ch=『*』,則將棧st中相應兩個數相乘,並將結果儲存在前乙個數中,然後退棧。

(3) 若ch=『/』,先判斷st棧頂元素是否為0(即分母是否是0),若不為0則將相應兩個數相除,並將結果儲存在前乙個數中,然後退棧。否則,輸出「除0是錯誤的」。

(4) 若ch=數字,則需要考慮兩位以上數的情形,使用witch迴圈進行湊數後存入運算元棧;相反(即一位數的情況),可直接發給運算元棧。

流程圖如下:

四. 源程式

#include<>

#define maxsize 99

void translate(char str,char exp) /*將算術表示式轉換成字尾表示式*/

op定義乙個含data和top的結構體*/

char ch

int i = 0,t = 0;

= -1;

ch = str[i將str的每乙個數轉換成ch*/

i++;

while(ch != '\0ch對應不同的符號的時候對應的轉換情況*/

while( != -1得到剩下的部分*/

exp[t] = '\0表示式結束*/

}float cal_value(char exp)

st運算元棧*/

float d;

char ch;

int t = 0;

= -1;

ch = exp[t];

t++;

while(ch != '\0')

演算法與資料結構

演算法 是按部就班地解決某個問題的方法,是對特定問題求解步驟的一種描述。偽碼語言是一種包括高階程式語言的3種基本控制結構 順序 選擇和迴圈 和自然語言成分的 物件導向 的語言。演算法的特徵 1 可行性 一是演算法中的每個步驟必須是能實現的 二是演算法執行的結果要能達到預期的目的。2 確定性 演算法的...

資料結構與演算法信

美國uiuc大學博士生梅俏竹 資料結構是美國所有一流計算機系的本科核心課程之一,上承計算引論與初級程式設計,下啟高階演算法和計算理論,向來是計算機本科教學的重中之重。我在北大上過的諸多本科基礎課中,無論從課程內容和老師教學下的功夫來看,張銘老師的 資料結構與演算法 課程都是首屈一指的。可以說,將北大...

資料結構與演算法作業

說明 1 題號形式 每題都以 sn,cha,sec 開頭,sn表明本題的題目序號,每道題都有唯一的序號 cha表示內容所在的章 sec表示內容所在的節。如 17,2,1 表示序號17的題來自第2章第1節。2 題型 1 填空題 1 80 2 分析計算作圖題 序號1 30題 選自 資料結構題集 嚴蔚敏等...