當前位置:首頁 » 編程語言 » c語言逆波蘭計算

c語言逆波蘭計算

發布時間: 2022-12-24 14:13:25

A. c語言編程-逆波蘭表達式求值

這是個數據結構里常規的題目,我資料里有聯系方式。

B. 用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. 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;
}

D. 將下面的算術運算式表示成逆波蘭式(數據結構 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+*
完畢!

以上就是整個從中綴表達式到後綴表達式的過程,棧的變化情況已經都寫出來了。

E. c語言這兩個式子用「逆波蘭式」怎麼寫

逆波蘭式就是後綴表達式。這個數據結構棧結構課里學的,比較簡單。步驟如下:

1.從左到右進行遍歷
2.運算數,直接輸出.
3.左括弧,直接壓入堆棧,(括弧是最高優先順序,無需比較)(入棧後優先順序降到最低,確保其他符號正常入棧)
4.右括弧,(意味著括弧已結束)不斷彈出棧頂運算符並輸出直到遇到左括弧(彈出但不輸出)
5.運算符,將該運算符與棧頂運算符進行比較,
如果優先順序高於棧頂運算符則壓入堆棧(該部分運算還不能進行),
如果優先順序低於等於棧頂運算符則將棧頂運算符彈出並輸出,然後比較新的棧頂運算符.
(低於彈出意味著前面部分可以運算,先輸出的一定是高優先順序運算符,等於彈出是因為同等優先順序,從左到右運算)
直到優先順序大於棧頂運算符或者棧空,再將該運算符入棧.
6.如果對象處理完畢,則按順序彈出並輸出棧中所有運算符.
所以,答案就是

a2b*3/+
a2+b*3/

F. 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);
}

G. 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();
}

H. 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);
}

熱點內容
ata72x是多大的壓縮機 發布:2024-05-16 15:07:59 瀏覽:93
安卓如何實現carplay的功能 發布:2024-05-16 15:02:54 瀏覽:713
網路如何接通外國游戲伺服器 發布:2024-05-16 14:53:34 瀏覽:628
下載不是緩存 發布:2024-05-16 14:37:06 瀏覽:504
ssrpc端怎麼刪除伺服器 發布:2024-05-16 13:53:14 瀏覽:235
如何配置gdc伺服器 發布:2024-05-16 13:53:12 瀏覽:984
安卓系統阿爾法編譯器 發布:2024-05-16 13:51:49 瀏覽:989
建行支付密碼器怎麼用 發布:2024-05-16 13:50:19 瀏覽:985
智能手環如何配置 發布:2024-05-16 13:48:00 瀏覽:484
shell腳本vim 發布:2024-05-16 13:43:15 瀏覽:302