手机
当前位置:查字典教程网 >编程开发 >C语言 >C语言实现逆波兰式实例
C语言实现逆波兰式实例
摘要:复制代码代码如下:#include#includetypedefstruct{chars[20][20];inttop;}SQ;voidco...

复制代码 代码如下:

#include<stdio.h>

#include<string.h>

typedef struct{char s[20][20];int top;}SQ;

void copystr(char *a,char *b)

{

int i=0;

do

{

b[i]=a[i];

i++;

}

while(a[i]!='');

b[i]='';

}

void voidSQ(SQ *s)

{

s->top=-1;

}

int ifempty(SQ *s)

{

return(s->top==-1);

}

void push(SQ *S,char *c)

{

if(S->top==19)

printf("over flown");

else

{

S->top++;

copystr(c,S->s[S->top]);

}

}

char *pop(SQ *S)

{

if(ifempty(S))

{

printf("over flow!n");

return(NULL);

}

else

return(S->s[S->top--]);

}

int judge(char *c)

{

if(c[1]=='')

switch(c[0])

{

case '+':return(3);

case '-':return(3);

case '*':return(2);

case '/':return(2);

default:return(1);

}

else

return(1);

}

void write(char *a,char *b,char *c)

{

strcat(a,c);

strcat(a,b);

}

int seek(char *c,int start)

{

int signal=1;

for(start=start++;c[start]!=''&&signal!=0;start++)

{

if(c[start]==')')

signal--;

else if(c[start]=='(')

signal++;

}

if(signal==0)

return(start-1);

else

{

printf("输入无效式子n");

return(-1);

}

}

void FB(SQ *A,SQ *B)

{

for(;!ifempty(A);)

{

push(B,A->s[A->top]);

pop(A);

}

}

char *rewrite(char *A)

{

SQ front;

SQ back;

int i,j,k,flag=0;

char *result;

char mid[20];

voidSQ(&front);

voidSQ(&back);

for(i=0;A[i]!='';)

{

if(A[i]=='(')

{

j=seek(A,i);

for(k=i+1;k<j;k++)

{

mid[k-i-1]=A[k];

}

mid[j-i-1]='';

copystr(rewrite(mid),mid);

push(&back,mid);

i=j+1;

}

else if(A[i]!='(')

{

mid[0]=A[i];

mid[1]='';

push(&back,mid);

i++;

}

}

FB(&back,&front);

for(;front.top>=2;)

{

flag=0;

for(i=0;i<=front.top;i++)

{

if(judge(front.s[i])==2)

{

flag=1;

break;

}

}

if(flag==1)

{

for(;front.top>=2;)

{

if(judge(front.s[front.top])==1&&judge(front.s[front.top-1])==2&&judge(front.s[front.top-2])==1)

{

write(front.s[front.top],front.s[front.top-1],front.s[front.top-2]);

push(&back,front.s[front.top]);

pop(&front);

pop(&front);

pop(&front);

}

else

{

push(&back,front.s[front.top]);

pop(&front);

}

}

FB(&front,&back);

FB(&back,&front);

}

else

{

for(;front.top>=2;)

{

if(judge(front.s[front.top])==1&&judge(front.s[front.top-1])==3&&judge(front.s[front.top-2])==1)

{

write(front.s[front.top],front.s[front.top-1],front.s[front.top-2]);

push(&back,front.s[front.top]);

pop(&front);

pop(&front);

pop(&front);

}

else

{

push(&back,front.s[front.top]);

pop(&front);

}

}

FB(&front,&back);

FB(&back,&front);

}

}

result=front.s[front.top];

return(result);

}

typedef struct{char c[20];int top;}sq;

int execute(char a,char b,char c)

{

switch(a)

{

case('+'):return((c-48)+(b-48));

case('-'):return((c-48)-(b-48));

case('*'):return((c-48)*(b-48));

case('/'):return((c-48)/(b-48));

}

}

void voidsq(sq *s)

{

s->top=-1;

}

int ifsqempty(sq *s)

{

return(s->top==-1);

}

void pushsq(sq *s,char x)

{

if(s->top==19)

printf("over flow!n");

else

{

s->top=s->top+1;

s->c[s->top]=x;

}

}

void popsq(sq *s)

{

if(ifsqempty(s))

printf("over flow!n");

else

s->top--;

}

int just(char c)

{

switch(c)

{

case ('+'):return(0);

case ('-'):return(0);

case ('*'):return(0);

case ('/'):return(0);

default:return(1);

}

}

void restread(sq *a,sq *b)

{

for(;!ifsqempty(a);)

{

pushsq(b,a->c[a->top]);

popsq(a);

}

}

int calculate(char *c)

{

sq rest,read;

int i,re;

voidsq(&rest);

voidsq(&read);

for(i=0;c[i]!='';i++)

pushsq(&read,c[i]);

for(;read.top>=2;)

{

for(;read.top>=2;)

{

if(just(read.c[read.top])==0&&just(read.c[read.top-1])==1&&just(read.c[read.top-2]) ==1)

{

re=execute(read.c[read.top],read.c[read.top-1],read.c[read.top-2]);

pushsq(&rest,re+48);

popsq(&read);

popsq(&read);

popsq(&read);

}

else

{

pushsq(&rest,read.c[read.top]);

popsq(&read);

}

}

restread(&read,&rest);

restread(&rest,&read);

}

return(read.c[0]-48);

}

void main()

{

char re[20];

char a[20];

printf("请输入算式:n");

scanf("%s",a);

copystr(rewrite(a),re);

printf("逆波兰式:n%sn",re);

printf("求值结果:n%dn",calculate(re));

}

【C语言实现逆波兰式实例】相关文章:

C 语言基础教程(我的C之旅开始了)[九]

C语言 实现N阶乘的程序代码

用C语言实现单链表的各种操作(二)

C++实现:螺旋矩阵的实例代码

使用map实现单词转换的实例分析

用c语言实现冒泡排序,选择排序,快速排序

基于C语言实现shell指令的详解

C语言函数的递归和调用实例分析

C语言获得电脑的IP地址的小例子

C语言实现静态链表的方法

精品推荐
分类导航