問題:
現在有乙個合法的二進位制表示式,請計算出該表示式的值
———————————————————————————————————
input
輸入一行字串,表示乙個二進位制表示式。長度不超過 100,000
ouput
輸出表示式的值
input output
(0&1^0|1)|1&0 ^1 1
———————————————————————————————————
兩種方法
1:被動
遇到右括號再進行運算,直至左括號
#include
#include
charop(
char a,
char b,
char c)
if(b==
'|')
if(b==
'^')
}char a[
100000000];
char f[
100000000];
char s[
100000000];
char f1[
100000000];
char s1[
100000000];
intmain()
while
(f[fi-1]
!='('
)else
}while
(fj)
while
(f[fi-1]
!='('
)else
}while
(fj)
while
(f[fi-1]
!='('
)else
}while
(fj)
fi--
;break
;case
'0':
case
'1':
s[si++
]=a[i]
;break
;default
: f[fi++
]=a[i]
;break;}
i++;}
printf
("%d"
,s[0]-
'0')
;}
理解:
1:使用棧分別儲存數字和運算子及』(』,當遇到』)'時進行運算
2:考慮到優先順序的原因,須按優先順序的順序處理運算子,先處理所有最高的優先順序,然後次之,因此外加乙個儲存數字和乙個儲存運算子的棧,來暫時儲存位於較靠近棧頂位置又優先順序小的運算子及其運算元
———————————————————————————————————
2:主動
#include
charop(
char a,
char b,
char c)
if(b==
'|')
if(b==
'^')
}int
taller
(char c,
char c1)
if(c==
'&')
if(c1==
'^')
if(c==
'^')
return0;
}char a[
100000000];
char stack[
100000000];
int top;
char queue[
1000000000];
int front,tail;
void
push
(char c)
char
pop(
)void
enqueue
(char c)
char
dequeue()
intmain()
break
;case
'0':
case
'1':
enqueue
(a[i]);
break
;default:if
(top!=0)
c=pop();
}if(!flag)
flag=0;
}push
(a[i]);
//將新符號加入棧中
break;}
i++;}
while
(top)
i=front;
while
(i!=tail)
char a,b;
while
(tail!=front)
else
}printf
("\n%c"
,pop()
);}
理解:
1:若棧頂運算子優先順序大於或等於新運算子,則優先順序保證可以先運算棧頂運算子
2:遇到右括號可一直運算到左括號,因為有1保證前面的運算子優先順序總比後面小
3.中綴表示式轉字尾表示式:(可以不需要轉換,直接算,以上**有轉換)
從左到右遍歷,遇數字入佇列,若是左括號,入棧,若是右括號,全部運算子出棧入佇列,直至左括號,
若是運算子,若棧不空且棧頂不是左括號且棧頂運算子優先順序不比該運算子小,取出棧頂運算子加入佇列,繼續判斷,再將該運算子入棧,遍歷結束後將運算子全部出棧入佇列
計算表示式值(字尾表示式) 棧
處理表示式主要是對優先順序以及括號的判斷 1.運算子棧頂的優先順序小於加入的時,需要將所有的不評級的取出並計算,2.當遇到 時,需要括號內的運算全部處理 2.其他情況全部加入運算子棧和資料棧 include include include using namespace std typedef lo...
用棧計算表示式
首先宣告我們的表示式 expression 只是簡單的四則運算,再加上小括號.運算元operand,操作符operator 如果直接給出字尾表示式 postfix,也叫逆波蘭式 是最容易計算的,這種表示式中已經不含括號.方法 遇到運算元時壓入棧中 遇到操作符時從棧中彈出兩個元素進行此運算,再將運算結...
棧實現表示式計算
讓index 1,並盤算是否掃瞄到expression最後 index if index expression.length 掃瞄完畢,就順序從數棧和符號棧中pop出相應的數和符號,並執行 while true num1 numstack.pop num2 numstack.pop oper ope...