基礎演算法 通過字尾表示式實現表示式的計算

2021-09-29 17:21:54 字數 3430 閱讀 2233

(1)從鍵盤接收算術表示式,以「#」表示接收結束;

(2)輸出算術表示式的值;

(3)運算元僅限於非負整數,操作符只能是+、-、*、/、^、(、)

(4)可以判斷表示式的合法性(如括號的匹配)

寫作業時遇到的一道題目,覺得比較麻煩,估計以後會有人遇到相同的問題,就寫了篇部落格記錄下來。

(1)先將表示式轉化成字尾表示式

(2)逐個讀取字尾表示式,計算結果

(1)設立操作符棧。

(2)設表示式的結束符為「#」,預設操作符棧的棧底為「#」。

(3)若當前字元是運算元,則直接傳送給字尾式。

(4)若當前字元為操作符且優先順序大於棧頂操作符,則人棧,否則退出棧頂操作符傳送給字尾式。

(5)若當前字元是結束符,則自棧頂至棧底依次將棧中所有操作符傳送給字尾式。

(6)「(」對它之前後的操作符起隔離作用,則若當前操作符為「(」時人棧。

(7)「)」可視為自相應左括號開始表示式的結束符,則從棧頂起,依次退出棧頂操作

符傳送給字尾式直至棧頂字元為「("止。「(」不傳送到字尾式。

/*seqstack *l操作符棧,char *str1讀取的表示式,char *str2返回的字尾表示式*/

void

conversion

(seqstack *s,

char

*str1,

char

*str2)

else

pop(s,

&e);

/*pop掉前括號*/

}elseif(

*p==

'#')

}elseif(

compare

(*p,

gettop

(s))

)elseif(

!compare

(*p,

gettop

(s)))}

p++;}

str2[i-1]

='\0'

;/*#號也存進去了,所以用'\0'覆蓋掉*/

}

#include

#include

#include

#include

#include

#define true 1

#define false 0

#define stack_size 50

char ops[8]

=;/*運算子陣列*/

int priority[8]

=;typedef

struct

seqstack;

/*運算子棧的定義*/

typedef

struct

nseqstack;

/* 運算數棧的定義*/

void

initstack

(seqstack *s)

/*初始化運算子棧*/

void

initstackn

(nseqstack *s)

/*初始化運算數棧*/

intisempty

(seqstack *s)

/*判斷棧s為空棧時返回值為真,反之為假*/

intisemptyn

(nseqstack *s)

/*判斷棧s為空棧時返回值為真,反之為假*/

/*判棧滿*/

intisfull

(seqstack *s)

/*判斷棧s為滿棧時返回值為真,反之為假*/

intisfulln

(nseqstack *s)

/*判斷棧s為滿棧時返回值為真,反之為假*/

intpush

(seqstack *s,

char x)

/*運算子棧入棧函式*/

else

}int

pushn

(nseqstack *s,

int x)

/*運算數棧入棧函式*/

else

}int

pop(seqstack *s,

char

*x)/*運算子棧出棧函式*/

else

}int

popn

(nseqstack *s,

int*x)

/*運算數棧出棧函式*/

else

}char

gettop

(seqstack *s)

/*運算子棧取棧頂元素函式*/

else

}int

gettopn

(nseqstack *s)

/*運算數棧取棧頂元素函式*/

else

}int

isoperator

(char ch)

/*判斷輸入字元是否為運算子函式,是返回true,不是返回false*/

return false;

}int

compare

(char c1,

char c2)

/*seqstack *l操作符棧,char *str1讀取的表示式,char *str2返回的字尾表示式*/

void

conversion

(seqstack *s,

char

*str1,

char

*str2)

else

pop(s,

&e);

/*pop掉前括號*/

}elseif(

*p==

'#')

}elseif(

compare

(*p,

gettop

(s))

)elseif(

!compare

(*p,

gettop

(s)))}

p++;}

str2[i-1]

='\0'

;/*#號也存進去了,所以用'\0'覆蓋掉*/

}int

calc

(char

*str)

else

break

;default

:printf

("error\n");

break;}

pushn

(n,result);}

p++;}

return result;

}int

main()

利用字尾表示式求解,只需要從左向右依次掃瞄表示式,

(1)遇到運算元人棧,

(2)遇到操作符.則做出棧兩次,獲得兩個運算元,

後出棧的運算元為第乙個操作物件,對它們進行計算,

計算結果作為下次運算的運算元入棧。

重複上述操作,直到字尾表示式讀取結束,既可完成表示式的計算。

字尾表示式實現表示式求值

看到別人寫的乙個表示式求值程式,想到很久之前寫的乙個。中間有個字串轉數值型,可以用stringstream來實現或者c語言裡面的strtod直接得到 include include include include includeusing namespace std class data doubl...

中綴表示式轉字尾表示式演算法及實現

1 23 include 4 using namespace std 56 template class mystack 7 20 2122 template void mystack init 23 26 27 template bool mystack empty 28 31 32 templa...

通過棧實現中綴表示式到字尾表示式的轉換

在程式設計的世界中資料結構和演算法總是形影不離,難捨難分的.棧作為一種常見的資料結構 抽象資料型別 在程式的世界中有非常的意義.在電腦科學中,棧是一種抽象資料型別 adt abstract data type 用作資料的集合表示.棧有兩個主要的操作 簡單來說,棧就是乙個 先出 lifo last i...