c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - *(、)等运算符

c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - *(、)等运算符,第1张

以前写的程序

#include<stdioh>

#include<stringh>

#define MAX 200

typedef char datetype;

typedef struct Stack

{

datetype elem[MAX];

int top;

}S;//定义存放运算符的栈

typedef struct stack

{

int num[MAX];

int top;

}ss;//定义存放数字的栈

int degree(char member)

{

if(member==''||member=='/')

return 1;

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

return 0;

return -1;

}//返回运算符各自的优先级

int number(char ch)

{

if(ch>='0'&&ch<='9')

return 1;

return 0;

}//判断是否是数字

int prior(char member1,char member2)

{

return degree(member1)-degree(member2);

}//返回两个运算符那个优先

void Init(S s)

{

s->top=0;

}//初始化栈,即对top赋0。

int Full(S s)

{

if(s->top==MAX)

return 1;

return 0;

}//判断是否栈满

int Empty(S s)

{

if(s->top==0)

return 1;

return 0;

}//判断是否空栈

/入栈

1判断是否栈满

2未满则将元素入栈,top++

/

int Push(S s,datetype x)

{

if(Full(s))

return 0;

s->elem[s->top++]=x;

return 1;

}

int push(ss s,int x)

{

if(s->top==MAX)

return 0;

s->num[s->top++]=x;

return 1;

}

/出栈

1判断是否空栈

2非空则top--。

/

int Pop(S s)

{

if(Empty(s))

return 0;

s->top--;

return 1;

}

int pop(ss s)

{

if(s->top==0)

return 0;

s->top--;

return 1;

}

/获取栈顶元素

1判断是否空栈

2非空则返回栈顶元素。

/

datetype GetTop(S s)

{

if(Empty(s))

{

return 0;

}

return s->elem[s->top-1];

}

int gettop(ss s)

{

if(s->top==0)

return 0;

return s->num[s->top-1];

}

/

1判断得到的运算符是什么类型

2根据运算符来计算并返回结果。

/

int Count(int num1,int num2,char ch)

{

if(ch=='')

return num1num2;

if(ch=='/')

return num2/num1;

if(ch=='+')

return num1+num2;

if(ch=='-')

return num2-num1;

return 0;

}

/

1将所有'['和']'转化为'('和')'。(因为其效果一样)

2遇到(则入栈,遇到运算符若栈为空或栈顶元素为(则入栈,栈顶元素为其他运算符则按3的方法。

3两个运算符优先级相同或后者小于前者,则d出前者,并d出num最后两个元素进行运算得到结果入栈,否则入栈

4遇到)则不停d出运算符直至遇到一个(,同时运算得到结果入栈

/

int translate(char str[])

{

int ans=0,len,n,m;

int i;

S sign;

ss num;

numtop=0;

Init(&sign);

len=strlen(str);

printf("转化为后缀为 :");

for(i=0;i<len;i++)

{

if(str[i]=='[') str[i]='(';

if(str[i]==']') str[i]=')';

}

for(i=0;i<len;i++)

{

if(number(str[i]))

{

printf("%c",str[i]);

m=str[i]-'0';

if(i>0&&number(str[i-1]))

{

n=gettop(&num);

pop(&num);

push(&num,n10+m);

}

else

{

push(&num,m);

}

if(i<len-1&&!number(str[i+1]))

printf(" ");

}

else

{

int n1,n2,nn;

char ch;

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

{

Push(&sign,str[i]);

}

else if(str[i]==')')

{

while(GetTop(&sign)!='(')

{

ch=GetTop(&sign);

n1=gettop(&num);

pop(&num);

n2=gettop(&num);

pop(&num);

nn=Count(n1,n2,ch);

push(&num,nn);

printf("%c ",ch);

Pop(&sign);

}

Pop(&sign);

}

else

{

if(!Empty(&sign)||GetTop(&sign)=='(')

{

char ch1=str[i];

int h;

while(!Empty(&sign)||GetTop(&sign)=='(')

{

char ch=GetTop(&sign);

h=prior(ch1,ch);

if(h==1)

{

Push(&sign,ch1);

break;

}

if(h==0||h==-1)

{

int n1,n2;

n1=gettop(&num);

pop(&num);

n2=gettop(&num);

pop(&num);

nn=Count(n1,n2,ch);

push(&num,nn);

printf("%c ",ch);

Pop(&sign);

}

}

if(h!=1) Push(&sign,ch1);

}

else

{

Push(&sign,str[i]);

}

}

}

}

while(!Empty(&sign))

{

char ch=GetTop(&sign);

int n1,n2,nn;

n1=gettop(&num);

pop(&num);

n2=gettop(&num);

pop(&num);

nn=Count(n1,n2,ch);

push(&num,nn);

printf("%c ",ch);

Pop(&sign);

}

printf("\n");

ans=gettop(&num);

return ans;

}

/匹配检查

1遇到(,[入栈。

2遇到],检查栈顶是否为[,遇到),检查栈顶是否为(

3结束后看是否栈为空或(与)、[与]个数是否相等。

/

int right(char str[])

{

int i,len,n1=0,n2=0,m1=0,m2=0;

S s;

Init(&s);

len=strlen(str);

for(i=0;i<len;i++)

{

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

{

Push(&s,str[i]);

n1++;

}

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

{

Push(&s,str[i]);

m1++;

}

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

{

if(GetTop(&s)!='(')

return 0;

Pop(&s);

n2++;

}

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

{

if(GetTop(&s)!='[')

return 0;

Pop(&s);

m2++;

}

}

if(n1!=n2||m1!=m2) return 0;

return 1;

}

int main()

{

char str[MAX]={"3[2+2(1+5)]-210+4"};

printf("举例如下:\n计算3[2+2(1+5)]-210+4\n");

printf("计算结果为%d\n",translate(str));

while(gets(str))

{

int ans;

if(!right(str))

{

printf("输入有误!\n");

continue;

}

ans=translate(str);

printf("计算结果为%d\n",ans);

}

return 0;

}

var s:ansistring;

begin

readln(s);

p:=1;pp:=0;

while p<>0 do begin

p:=pos('(',s);

pp:=pos(')',s);

求出括号里的值,在s中删去原串,代入值;

while p·····

找到乘号除号

求出值再代入;

for i:=1 to length(s) do

再求加减

writeln(t);

end

写的较为粗糙

//不能算负数 输入的话像这样 1+2(3+4)然后回车

#include<stdioh>

#include<stringh>

char s3[10][10];

static int x=0;

int f(char s, char s1[10][10])

{

    int a, i, k;

    char p;

    p = s;

    i=0; k=0;

    while(p)

    {

 

        if(p>='0'&&p<='9')

            if(i==0) { a=atoi(p); itoa(a, &s1[k++][0], 10); i=1;}

            else;

        else {  i=0; s1[k][0]=p; s1[k][1]=0; k++;}

        p++;

         

    }

    return k;

}

 

 

int c(char s)

{

    switch(s)

    {

    case '-': 

    case '+':  return 2;

    case '': 

    case '/':  return 3;

    case ')':

    case '(':  return 1;

    default :  return 0;

    }

 

}

int t(char s, int a, int b)

{

    if(s=='+') return a+b;

    if(s=='-') return a-b;

    if(s=='') return ab;

    if(s=='/') return a/b;

}

 

void o(char s1[10], char s, int n)

{

    static int i, j;

    int k;

    if(s=='(')  {i++; s1[i]='('; return;}

    if(s==')')  { do { s3[x][0]=s1[i]; s3[x][1]=0; x++;   i--;} while(s1[i]!='('); i--; return ;}

    if(n==0&&i>=0)  do { s3[x][0]=s1[i]; s3[x][1]=0; x++;i--;} while(i!=-1);   

    if(i==0&&s1[0]==0)  { s1[0] = s;}

    else if(c(s)>=c(s1[i])) s1[++i]=s;

    else { do { s3[x][0]=s1[i]; s3[x][1]=0; x++;if(i==0) { i--; break;} i--;}  while(c(s1[i])>c(s)); i++; s1[i]=s;}

     

     

}

void main()  

{

    char s1[100];

    char s[10][10];

    char s2[10];

    int s4[10];

    char s5[10];

    int k, i, a, l;

    int u=0;

    int p, q;

    gets(s1);

    k=f(s1, s);

    s2[0]=0;

 

    for(i=0; i<k; i++)

    {

        if(c(s[i][0])==0) {  strcpy(&s3[x][0], &s[i][0]); x++;}

        else

        {

 

            o(&s2[0], s[i][0],1);

 

        }

   

    }

     

        o(s2, s[i][0],0);

 

 

 

        for(i=0; i<k; i++) printf("%s ", &s3[i][0]);

 

       for(i=0, l=0, u=0; i<k; i++)

       {

           if(s3[i][0]>='0'&&s3[i][0]<='9') 

           {

               s4[i] = atoi(&s3[i][0]);

           }

 

       }

       printf("\n");

 

       printf("\n开始计算\n");

       

       for(i=0; i<k; i++)

       {

           if(c(s3[i][0])==3||c(s3[i][0])==2)

           {

         

               p=i;

              

               while(s3[p][0]<'0'||s3[p][0]>'9') p--;

               q=p-1;

               while(s3[q][0]<'0'||s3[q][0]>'9') q--;

               s3[p][0]='z';

 

 

               printf("\n%d  %c  %d  = ", s4[q], s3[i][0] , s4[p] );

                

 

               s4[q]=t(s3[i][0], s4[q], s4[p]);

 

               printf("%d\n", s4[q]);

 

 

           }

            

       }

       printf("\n结果=%d\n", s4[0]);

 

 

 

}

以上就是关于c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - * \ (、)等运算符全部的内容,包括:c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - * \ (、)等运算符、求中缀表达式直接求值(不转换为后缀)P代码,表达式含括号,风格贴近pascal语言的伪代码也可、中缀表达式求值问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9417137.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存