c語言實現逆波蘭算法,C語言逆波蘭式求值

本文目錄一覽:

用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語言編寫逆波蘭計算器

#includestdio.h

#includestdbool.h

#includestdlib.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語言 逆波蘭表達式 算法

#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語言求解逆波蘭表達式

使用棧完成

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;

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/190876.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:07
下一篇 2024-11-30 09:07

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論