使用棧實現計算器,最主要的就是進行運算子的優先順序判斷,然後進行對應的計算,然後將其壓入棧和從棧中取出來。
其中要對輸入的表示式進行判斷,如果表示式不符合的話就直接不用計算。
下面直接上**
#include
#include
#include
using
namespace std;
const
int maxsize =20;
const
char a[7]
[7]=
,,,,
,,};
const
char b[7]
=;typedef
struct stackistacki;
typedef
struct stackcstackc;
intsearch
(char c)
return
(i);
}char
precede
(char c1,
char c2)
//初始化
void
initstacki
(stacki *st)
void
initstackc
(stackc *st)
//判斷棧是否為空
intstackempty
(stackc sc)
else
}//得到棧頂的資料
char
gettopc
(stackc st)
intgettopi
(stacki st)
//往棧裡面增加資料
void
pushc
(stackc *st,
char c)
void
pushi
(stacki *st,
float n)
//資料出棧
char
popc
(stackc *st)
}float
popi
(stacki *st)
}//判斷輸入的是數字還是運算子
bool
isdigti
(char a)
else
}bool
isc(
char d)
else
}//計算
float
operate
(float i,
char theta,
float j)
return result;
}int
main()
temps[j]
=lines[i]
; i++
; j++;if
(i>=len)
break;}
if( nofpoint>1||
(i(lines[i]
!='-'
&& lines[i]
!='+'
&& lines[i]
!='*'
&& lines[i]
!='/'
&& lines[i]
!=')'))
)//表示式中不止乙個小數點還有數字後面跟的不是運算子則表示式錯誤
temps[j]
='\0'
; b =
atof
(temps)
;// printf("%f\n",b);
pushi
(&si,b);if
(i>=len)
break;}
else
// 「(」放表示式最後面,錯誤
if(lines[i]
=='-'
|| lines[i]
=='+'
|| lines[i]
=='*'
|| lines[i]
=='/'
)//「+、-、*、/、^」放在表示式最後面,錯誤if(
(!isdigti
(lines[i+1]
))&&(
!isc
(lines[i+1]
))&& lines[i+1]
!='('
)//「+、-、*、/、^」後面跟的不是數字或者變數,錯誤}if
(lines[i]
=='-'
&&(i==
0|| lines[i-1]
=='('))
//運算子是負號
elseif(
precede
(gettopc
(sc)
,lines[i])==
'=')
else}if
(i>=len)
break;}
}else
printf
("的值\n");
scanf
("%f"
,&b)
;pushi
(&si,b);if
(i>=len)
break;if
(lines[i]
!='-'
&& lines[i]
!='+'
&& lines[i]
!='*'
&& lines[i]
!='/'
&& lines[i]
!=')'
)//變數後面跟的不是「+、-、*、/、^、)」,則為錯誤}}
}if(g==0)
//g=0表示該字元是不符合要求的字元
}while
(gettopc
(sc)
!='='
) result =
operate
(a,operates,b)
;//printf("result is%f\n",result);
pushi
(&si,result);}
printf
("%.2f\n"
,result)
;return0;
}
用棧實現計算器
我們平時用swith語句寫的計算器,只能處理簡單的兩個運算元和乙個運算子,這樣其實和日常應用方面差的有點遠,所以我們今天學習了一種用棧來實現一條複雜表示式的計算。這個需要用到棧的相關知識,除此之外我們還需要學會如何把中綴轉換成字尾表示式,比如 3 4 5 2 3這樣乙個表示式,從左至右遇到運算元壓入...
用棧實現的計算器
問題描述 描述 從鍵盤輸入乙個算術表示式 保證是整數 並輸出它的結果 保證資料中除法是整除 輸入 輸入一行字串表示算術表示式包括0.9,輸出 每行輸出計算結果 規則 1.自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。2.當遇到運算子時如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取...
用棧實現基本計算器
趣味 演示 1.3 演示 實現乙個基本的計算器來計算乙個簡單的字串表示式 s 的值。示例 1 輸入 s 1 1 輸出 2 示例 2 輸入 s 2 1 2 輸出 3 因為睡眠不好的原因,總覺得頭脹脹的,精神狀態不好,但每日演算法的斷更又是我所不能接受的。所以這一篇我就用了力扣官方的題解,來為大家解析一...