Calculate

#include<stdio.h>
#include<string.h>
#define MAXSIZE 20
typedef struct
{
 char data[MAXSIZE];
 int top;
}SeqStack;

SeqStack optr, opnd, R;

void change(char s1[30],char s2[30]);
int Priority(char ch);

void SeqStackInit(SeqStack * s)
{// init stack
 s->top = -1;
}

void SeqStackPush(SeqStack * s , char x)
{ // push stack
 if(s->top == MAXSIZE-1)
  {
   printf("栈满/n");
  }
 s->top++;
 s->data[s->top] = x;

}

char  SeqStackPop(SeqStack *s)
{// pop stack
 char x;
 if(s->top == -1)
  {
    printf("空栈/n");  
     return -1;
  }

 x = s->data[s->top];  
 s->top--;
 return x;

}
char SeqStackGetTop(SeqStack *s)
{
 return s->data[s->top]; 
}
char precede(char c1,char c2)
{
 int tag1,tag2;  //优先级标签
 if(c1=='(' && c2 ==')')  return '='; //栈定和读到的符号都是括号;
 switch(c1)
 {  
     case '(':  return '<';        //栈顶是'(',下个读到的符号入栈;
  case '*': 
  case '/':  tag1 = 1; break;  
  case '+': 
  case '-':  tag1 = 0; break;
  case '#':  return '<';        //栈顶为'#',入栈
  default : break;
 }
 switch(c2)
 {
  case '(':  return '<';       // ch = '(',入栈;
  case ')':  return '>';       // ch = ')', 出栈计算;
  case '*': 
  case '/':  tag2 = 1; break;
  case '+': 
  case '-':  tag2 = 0; break; 
  case '#' : return '>';        // ch='#'多项式结束
  default :  break;
 }
 if(tag1 >= tag2) return  '>';
 else return '<';

}

char  operate(char a,char t, char b)
{
 int n,m;
 n = a - 48;
 m = b - 48;
 switch(t)
 {
 case '+': n = m + n; break;
 case '-': n = n - m; break;
 case '*': n = m * n; break;
 case '/': n = n / m; break;
 default: break;
 }
 return n+48;    //数字转字符串 ;
}

void main(void)
{
 
 char ch,theta,a,b,s1[30],s2[30];
 int n;
 static int i=0;
 SeqStackInit(&optr);  //符号栈
 SeqStackPush(&optr, '#');
    SeqStackInit(&opnd);  // 数值栈
    printf("请输入一个多项式,结尾以'#'号标示:/n");
    ch = getchar();
 s1[i] = ch;
 while( !((ch == '#') && ( SeqStackGetTop(&optr) == '#')))
 {
  if(ch >= '0' && ch <= '9')
   {
    SeqStackPush(&opnd,ch);
    ch = getchar();
    s1[++i] = ch;
    
   }
  else switch(precede(SeqStackGetTop(&optr),ch))
   {
    case '<' : SeqStackPush(&optr,ch);
            ch = getchar();
         s1[++i] = ch;
         break;
    case '=' : SeqStackPop(&optr);
         ch = getchar();
         s1[++i] = ch;
         break;
    case '>' : theta = SeqStackPop(&optr);
       b = SeqStackPop(&opnd);
       a = SeqStackPop(&opnd);
       SeqStackPush(&opnd,operate(a, theta, b));
       break;
   }
 }
 n = SeqStackGetTop(&opnd) - 48;
 printf("运算结果为:%d /n",n);

 s1[i]='/0';
 printf("中缀表达式:/t%s/n",s1);
 change(s1,s2);
 printf("后缀表达式:/t%s/n",s2);
 


}


void change(char s1[30],char s2[30])
{
 int i=0,j=0;
 char ch,temp;
    SeqStackInit(&R);
 SeqStackPush(&R, '#');

 while(s1[i]!='/0')
 {
  if('0'<s1[i] && s1[i]<'9')
  {
   s2[j]=s1[i]; j++;
  }
  else if(s1[i]=='(')
    SeqStackPush(&R, s1[i]);
      else if(s1[i]==')')
    {
     ch = SeqStackPop(&R);  // 取得栈顶操作符
     while(ch != '(') // 直到弹出左括号
     {
      s2[j] = ch;
      ch = SeqStackPop(&R);
      j++;
     }

    }
    else {
      ch=SeqStackGetTop(&R);
      if(Priority(ch)==2) SeqStackPush(&R, s1[i]);
      else if(Priority(ch)<Priority(s1[i])) SeqStackPush(&R, s1[i]);
       else{
           s2[j++] = SeqStackPop(&R);
           ch = SeqStackGetTop(&R);
           while( ch!='#' && Priority(ch) < Priority(s1[i]))
           {
           s2[j++] = SeqStackPop(&R);
           ch = SeqStackGetTop(&R);
           }
           SeqStackPush(&R, s1[i]);  
       }  
    }
   i++; 
 }
 ch =SeqStackGetTop(&R);
 while('#'!=ch ){
  s2[j++] = ch;
  ch = SeqStackPop(&R);
        ch = SeqStackGetTop(&R);
 }
 s2[j++]='/0';
}

int  Priority(char ch)
{
 int tag;
 switch(ch)
 {
  case '-':tag = 0; break;
  case '+':tag = 0; break;
  case '*':tag = 1; break;
  case '/':tag = 1; break;
  case '#':tag = 2; break;
 }
 return tag;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值