您的位置:

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;

}