c語言逆波蘭表達式
#include <stdio.h>
#include <string.h>
int main()
{
double d[100], *dp = d;
int m, k;
char t[50], *tp = t;
char s[100], *c = s;
char* op = "+-*/";
char* fg = "0123456789.";
gets(s);
while(*c) {
if(strchr(op, *c)) {
*tp++ = *c;
k = 0;
}else
if(strchr(fg, *c)) {
sscanf(c, "%lf%n", dp++, &m);
c += m - 1;
++k;
}
++c;
while((dp - d > 1 && k == 2) || !*c && dp - d >= 1) {
switch(*--tp) {
case '+': dp[-2] = dp[-2] + dp[-1]; break;
case '-': dp[-2] = dp[-2] - dp[-1]; break;
case '*': dp[-2] = dp[-2] * dp[-1]; break;
case '/': dp[-2] = dp[-2] / dp[-1]; break;
}
--dp;
}
}
printf("%f", *dp);
}
❷ 算術表達式轉化成逆波蘭式(C語言)
你可以擴展一下。
// 中綴表達式轉化為後綴表達式,僅支持加減乘除運算、操作數為1位十進制非負整數的表達式。
char* infix2postfix(const char *infix, char *postfix)
{
const size_t N = strlen(infix);
if (N == 0 || postfix == NULL)
{
return postfix;
}
stack<char> opcode(N); // 堆棧存放的是操作符
for (size_t i = 0; i < N; i++)
{
switch (infix[i])
{
case '(': // 直接忽略左括弧
break;
case ')': // 彈出操作符
*postfix++ = opcode.pop();
*postfix++ = ' ';
break;
case '+':
case '-':
case '*':
case '/':
opcode.push(infix[i]); // 壓入操作符
break;
default:
if (isdigit(infix[i])) // 如果是數字,直接輸出
{
*postfix++ = infix[i];
*postfix++ = ' ';
}
}
}
return postfix;
}
❸ C語言逆波蘭算數表達式
我用c語言寫的wintc下運行正確 希望對你有幫助
#include<stdio.h>
#include<string.h>
int nibolan(char s[])
{ int i=0,a,b;
char *p;
p=s ;
while(*p!='\0')
{if(*p=='+'){*p=((*(p-2)-48)+(*(p-1)-48))+48;}
if(*p=='-'){*p=((*(p-2)-48)-(*(p-1)-48))+48;}
if(*p=='*'){*p=((*(p-2)-48)*(*(p-1)-48))+48;}
if(*p=='/'){*p=((*(p-2)-48)/(*(p-1)-48))+48;}
p++;
} p--;
return (*p)-48;
}
main()
{ int r;
char a[100];
gets(a);
r=nibolan(a);
printf("%d",r);
getch();
}
❹ C語言求解逆波蘭表達式
使用棧完成
int add(char s[])
{
int st[100];
char *p;
int top=-1;
int A,B,sum=0;
for(p=s;*p!=0;p++)//進行數值計算
{
switch (*p)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':st[++top]=*p-'0';break;//是數字壓入總棧st中
case '+':
case '-':
case '*':
case '/'://是運算符號
A=st[top--];
B=st[top--];//彈出2個數字
switch (*p)
{
case '+':sum=B+A;break;
case '-':sum=B-A;break;
case '*':sum=B*A;break;
case '/': sum=B/A;break;
}
st[++top]=sum;//將結果重新壓入棧
break;
}
}
return sum;
}
❺ (C語言中)逆波蘭演算法(及計算器)
逆波蘭式子又叫做後綴表達式。(相對於前綴和中綴,但是它倆都破壞了式子本身,所以用後綴)
12+3應該表達為12 3+。(實際無空格,為了好看)
先解決一個問題,就是123+會不會認為是1和23或者1和2和3,其實是不會的。一般後綴式都是用棧存儲的,你在定義棧的時候裡面的elemtype e(當然也可以用別的就是舉例),這個elemtype是重命名的int。scanf或者cin輸入的時候,你先輸入12,這個就被存在棧的第一空裡面(因為是%d嘛),再輸入3就被存在第二空裡面了。這個不會混淆。
逆波蘭演算法是這么工作的:在後綴式中掃描,可能會掃描到一堆數字,但是這時候如果掃描到了一個運算符(加減乘除等),這時候提取運算符並提取運算符前面緊挨著的那兩個數字(注意是緊挨),然後這兩個數字和這一個運算符進行運算。比如123+,掃描得12,掃描得3,掃描得+(電腦得到了+這個運算符),緊接著取前面緊挨的12和3,進行運算,就是12+3了。如(2+1) * 3就是21+3*。掃描得2,掃描得1,掃描得+,ok這時候2+1=3,3入棧,重新while掃描。掃描得3(剛才算出來剛入棧的那個),掃描得3,掃描得*,ok這時候3*3=9。
1+23這種後綴式是表達不出來的。後綴它的意義就在於兩個數,他們的運算符關系緊挨在他們後面。這個1+只有一個數,還原算是就是+1,無意義。
❻ C語言編寫逆波蘭計算器
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#defineSTACK_SIZE 20
intmake_empty(void);
boolis_empty(void);
boolis_full(void);
voidpush(char );
voidpop(char );
voidstack_overflow(void);
voidstack_underflow(void);
charcontents[STACK_SIZE]= {0},top;
intmain(int argc, char *argv[])
{
char ch='1';
while(ch!='q'){
make_empty();
printf("Enter an RPNexpression:");
do{
scanf(" %c",&ch);
if(ch>='1'&&ch<='9')
push(ch);
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'){
top--;pop(ch);
}
else if(ch=='='){
if((top-1)==0)
pop(ch);
else
printf("Nunber notused!");
break;
}
else if(ch=='\n');
else{
ch='q';break; /*其它情況置為退出標志q*/
}
}
while(ch!='\n');
}
return 0;
}
intmake_empty(void){
/* return top=0;
}
boolis_empty(void){
return top==0;
}
boolis_full(void){
return top==STACK_SIZE;
}
voidpush(char ch){
if(is_full())
stack_overflow();
else
contents[top++]=ch-'0';
}
voidpop(char ch){
if(is_empty())
stack_underflow();
else
switch(ch){
case'+':contents[top-1]+=contents[top];break;
case '-':contents[top-1]-=contents[top];break;
case'*':contents[top-1]*=contents[top];break;
case'/':contents[top-1]/=contents[top];break;
case '=':printf("Value ofexpression:%d\n",(int)contents[0]);break;
}
}
voidstack_overflow(void){
printf("Expression is toocomplex!");
exit(EXIT_FAILURE);
}
voidstack_underflow(void){
printf("Not enough operands inexpression!");
exit(EXIT_FAILURE);
}
❼ c語言這兩個式子用「逆波蘭式」怎麼寫
逆波蘭式就是後綴表達式。這個數據結構棧結構課里學的,比較簡單。步驟如下:
1.從左到右進行遍歷
2.運算數,直接輸出.
3.左括弧,直接壓入堆棧,(括弧是最高優先順序,無需比較)(入棧後優先順序降到最低,確保其他符號正常入棧)
4.右括弧,(意味著括弧已結束)不斷彈出棧頂運算符並輸出直到遇到左括弧(彈出但不輸出)
5.運算符,將該運算符與棧頂運算符進行比較,
如果優先順序高於棧頂運算符則壓入堆棧(該部分運算還不能進行),
如果優先順序低於等於棧頂運算符則將棧頂運算符彈出並輸出,然後比較新的棧頂運算符.
(低於彈出意味著前面部分可以運算,先輸出的一定是高優先順序運算符,等於彈出是因為同等優先順序,從左到右運算)
直到優先順序大於棧頂運算符或者棧空,再將該運算符入棧.
6.如果對象處理完畢,則按順序彈出並輸出棧中所有運算符.
所以,答案就是
a2b*3/+
a2+b*3/
❽ 將下面的算術運算式表示成逆波蘭式(數據結構 C語言版)
a*b*c → **abc
a*b*c+c*d → +**abc*cd
(a+b)*((c-d)*e+f) → *+ab+*-cdef
上面是波蘭式,逆波蘭式如下:
a*b*c → ab*c*
a*b*c+c*d → ab*c*cd*+
(a+b)*((c-d)*e+f) → ab+cd-e*f+*
寫出(a+b)*((c-d)*e+f)轉換時棧的變化情況:【注意,右端為棧頂】
讀入(,入棧,棧中為(,輸出:(空);
讀入a,直接輸出,棧中為(,輸出:a;
讀入+,入棧,棧中為(+,輸出:a;
讀入b,直接輸出,棧中為(+,輸出:ab;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為空,輸出:ab+;
讀入*,入棧,棧中為*,輸出:ab+;
讀入(,入棧,棧中為*(,輸出:ab+;
讀入(,入棧,棧中為*((,輸出:ab+;
讀入c,直接輸出,棧中為*((,輸出:ab+c;
讀入-,入棧,棧中為*((-,輸出:ab+c;
讀入d,直接輸出,棧中為*((-,輸出:ab+cd;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為*(,輸出:ab+cd-;
讀入*,入棧,棧中為*(*,輸出:ab+cd-;
讀入e,直接輸出,棧中為*(*,輸出:ab+cd-e;
讀入+,【由於此時棧中的*的優先順序高於+,所以先將*退棧,然後+入棧】,棧中為*(+,輸出:ab+cd-e*;
讀入f,直接輸出,棧中為*(+,輸出:ab+cd-e*f;
讀入),依次推出棧中的符號,直到遇見一個(【注意括弧不輸出】,棧中為*,輸出:ab+cd-e*f+;
此時讀入已經完畢,棧中還剩一個*,輸出:ab+cd-e*f+*
完畢!
以上就是整個從中綴表達式到後綴表達式的過程,棧的變化情況已經都寫出來了。
❾ 用c語言的棧來編寫逆波蘭公式的程序
如題,代碼如下,歡迎探討!!!
[code=C/C++][/code]
/*
表達式的後綴表示及其求值
*/
#include
<stdio.h>
typedef
int
ElemType;
/*
考慮到char型運算時的隱形提升會溢出,此處定義為int,代價僅浪費了內存空間
*/
#define
MAXNUM
16
struct
stack
{
ElemType
data[MAXNUM];
int
top;
};
void
StackInit(struct
stack
*stack)
{
int
i
=
0;
for(;i
<
MAXNUM;i++)
{
stack->data[i]
=
0;
}
stack->top
=
0;
/*
棧底部從索引0處開始
*/
}
void
StackPush(struct
stack
*stack,ElemType
c)
{
if(MAXNUM
==
stack->top)
/*
棧中元素最多有MAXNUM
-
1個
*/
{
printf("The
stack
is
full
");
return;
}
stack->data[stack->top++]
=
c;
}
ElemType
StackPop(struct
stack
*stack)
{
if(0
==
stack->top)
{
printf("The
stack
is
empty
");
/*
當棧空時,若返回0是錯誤的
*/
return
0;
}
return
stack->data[--stack->top];
}
void
PostfixEvaluation(struct
stack
*stack)
{
return;
/*
這個函數非常簡單了,所有的麻煩都已經解決了,我實在不想完成它
*/
}
int
ChangeToPostfix(char
*str)
{
int
i
=
0,flag
=
0;
/*
flag
用來標記連續數字的出現,沒想到好點的辦法
*/
int
c,ch;
struct
stack
ch_stack;
struct
stack
op_stack;
StackInit(&ch_stack);
StackInit(&op_stack);
while(
!=
(c
=
*(str
+
i)))
/*
此處需注意的是:如果是靜態的字元串,以為結束條件,如果是用戶輸入的,則以
』為結束條件
*/
{
if((*
==
c)
||
(/
==
c)
||
((
==
c))
{
flag
=
0;
StackPush(&op_stack,c);
}
else
if()
==
c)
{
flag
=
0;
while((
!=
(c
=
StackPop(&op_stack)))
{
StackPush(&ch_stack,c);
}
if(0
==
op_stack.top)
{
printf("the
(
hasnt
found
when
the
)
come
in!
");
return
-1;
}
}
else
if((+
==
c)||
(-
==
c))
{
flag
=
0;
/*
+和-優先順序低,運算符棧中的((如果存在)後的所有運算符需推出
*/
if(0
!=
op_stack.top)
/*
你可以不在此處添加top的檢查,那樣,你可以發現
StackPop錯誤返回的0被拾取了
*/
{
/*
被逼無奈,只得在此檢查top值,無法寄希望於StackPop了
*/
while((
!=
(ch
=
StackPop(&op_stack)))
{
StackPush(&ch_stack,ch);
if(0
==
op_stack.top)
{
break;
}
}
}
StackPush(&op_stack,c);
}
else
if((c
>=
0)
&&
(c
<=
9))
/*
對於表達式中2位或多位連續的數字,需特殊處理
*/
{
if(0
==
flag)
{
StackPush(&ch_stack,(c
-
0));
flag
=
1;
}
else
{
StackPush(&ch_stack,10
*
StackPop(&ch_stack)
+
(c
-
0));
}
}
i++;
}
while(0
!=
op_stack.top)
/*
表達式處理結束,將運算符棧中的所有運算符推出並壓入字元棧
*/
{
StackPush(&ch_stack,StackPop(&op_stack));
}
PostfixEvaluation(&ch_stack);
/*
該函數放在此處可能較為欠妥,可是,只要完成了任務不就OK了么,難道你會在乎?
*/
/*just
test
*/
for(i
=
0;i
<
ch_stack.top;i++)
{
if(+
==
ch_stack.data[i])
{
printf("+..");
}
else
if(-
==
ch_stack.data[i])
{
printf("-..");
}
else
if(*
==
ch_stack.data[i])
{
printf("*..");
}
else
if(/
==
ch_stack.data[i])
{
printf("/..");
}
else
{
printf("%d..",ch_stack.data[i]);
}
}
return
0;
}
int
main(void)
{
char
str[]
=
"12
+
34
*
435
-
5
/
1";
/*
just
test
*/
printf("The
result
should
be
:
");
printf("12
34
435
*
+
5
1
/
-
[=
8]
");
if(-1
==
ChangeToPostfix(str))
{
printf("ChangeToPostfix()
error
");
return
1;
}
return
0;
}
❿ C語言中有表達式,逆波蘭二詞,何為表達式,何為逆波蘭,誰能告訴我一下,謝謝啦
運算符置於其運算對象之後,這種表達式就是逆波蘭表達式。如:a=1+3 ---> a=1,3 +