c语言char diamond,大家好,我刚学c语言

该博客主要介绍了一种使用C语言实现中缀表达式转换为后缀表达式(逆波兰表示法)的方法,并结合栈的数据结构进行表达式的计算。通过定义两个栈,一个用于存储运算符,另一个用于存储运算数,实现了从输入的中缀表达式如'6+(7-5)-8*6',到后缀表达式的转换。转换后的后缀表达式可以更方便地进行计算。在计算过程中,根据运算符的优先级进行压栈和弹栈操作,最终得出表达式的值。
摘要由CSDN通过智能技术生成

#include "stdio.h"

#include "conio.h"

#define stack_size 100

typedef struct /*栈的定义*/

{  char elem[stack_size];

int top;

}SqStack;

SqStack InitStack()/*栈的初始化*/

{ SqStack s;

s.top=-1; /*栈空*/

return s;

}

char GetTop(SqStack * s,char * e)/*取栈顶的元素*/

{ if(s->top==-1) return 0;

*e=s->elem[s->top];

}

void Push(SqStack * s,char e)

{ /*if(s->top==(stack_size-1)) printf("Stack Overflow!"); */

s->top++;

s->elem[s->top]=e;

}

char Pop(SqStack * s,char * e)

{ /* if(s->top==-1) printf("Stack Overflow!"); */

* e=s->elem[s->top--];

}

typedef struct /*栈的定义*/

{  float elem[stack_size];

int top;

}SqStack1;

SqStack1 InitStack1()/*栈的初始化*/

{ SqStack1 s;

s.top=-1; /*栈空*/

return s;

}

int GetTop1(SqStack1 * s,int * e)/*取栈顶的元素*/

{ if(s->top==-1) return 0;

*e=s->elem[s->top];

}

void Push1(SqStack1 * s,int e)

{ /*if(s->top==(stack_size-1)) printf("Stack Overflow!"); */

s->top++;

s->elem[s->top]=e;

}

int Pop1(SqStack1 * s,int * e)

{ /* if(s->top==-1) printf("Stack Overflow!"); */

* e=s->elem[s->top--];

}

int SelLeve(char c1)

{ if(c1=='+'|| c1=='-') return 1;

else

if (c1=='*'|| c1=='/' || c1=='%') return 2;

else

if(c1=='(') return -1;

}

main()

{  char expr[100]="6+(7-5)-8*6";

houzhui(expr);

getch();

}

int  num1,num2,l;

int  houzhui(char expr[])

{  SqStack Optr=InitStack();

char c,d,b[10];

int index=0,i=0,j=0,k,dlevel;

char hz[100];

while(expr[index]!='\0')

{ c=expr[index];

if(c>='0'&& c<='9')/*判断是不是数,如果是就把它取出放在运算数数组中*/

{      ;

hz[i]=c;j=i;

i=index+1;k=i;

c=expr[i];

if(i

j=0;

while(c!='\0' && c>='0'&& c<='9' ||c=='.')

{hz[i]=c;i++;c=expr[i];j++;}

index=k+j;

hz[i]='@'; i++;

}

if(c=='+'|| c=='-')

{ int clevel=1;

d=GetTop(&Optr,&d);

dlevel=SelLeve(d);

if(d!='' && dlevel>=clevel)  {hz[i]=Pop(&Optr, &d);i++;hz[i]='@';i++;}

Push(&Optr,c);

index++;

}

if(c=='*'|| c=='/'|| c=='%')

{  int clevel=2;

d=GetTop(&Optr,&d);

dlevel=SelLeve(d);

if(d!='' &&dlevel >=clevel)  {hz[i]=Pop(&Optr, &d);i++;hz[i]='@';i++;}

Push(&Optr,c);

index++;

}

if(c=='(')

{ Push(&Optr,c);index++;}

if(c==')')

{ d=GetTop(&Optr,&d);

while(d!='('){hz[i]=Pop(&Optr,&d);i++;hz[i]='@';i++;d=GetTop(&Optr,& d);}

Pop(&Optr,&d); index++;

}

}

while(GetTop(&Optr,&d)!=''){hz[i]=Pop(&Optr,&d);i++;hz[i]='@';i++;}

l=i;

printf("hou zhui biao da shi :");

for(i=0;i

printf("\n------------------------------------------------------------");

printf("%d",l);

EvaluateExpr(hz);

}

int  EvaluateExpr(char hz[])

{ SqStack1 Opnd=InitStack1();

int i=0;

char c,d;

c=hz[i];

printf("\n%d",l);

while(i

{   printf("\n%c",hz[i]);

if(c=='@'||c==''){i++;c=hz[i];}

else

{

if( c>='0'&& c<='9' ||c=='.')

{Push1(&Opnd,(int)(c));i++;c=hz[i];}

else{

switch(c)

{case '+' :num1=Pop1(&Opnd,&d);num2=Pop1(&Opnd,&d);num1=num2+num1; Push1(&Opnd,num1);break;

case '-' :num1=Pop1(&Opnd,&d);num2=Pop1(&Opnd,&d);num1=num2-num1; Push1(&Opnd,num1);break;

case '*' :num1=Pop1(&Opnd,&d);num2=Pop1(&Opnd,&d);num1=num2*num1; Push1(&Opnd,num1);break;

case '/' :num1=Pop1(&Opnd,&d);num2=Pop1(&Opnd,&d);num1=num2/num1; Push1(&Opnd,num1);break;

case '%' :num1=Pop1(&Opnd,&d);num2=Pop1(&Opnd,&d);num1=num2%num1; Push1(&Opnd,num1);break;

}

}

}

}

/* printf("\n%d", Pop1(&Opnd,&d));*/

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值