(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...