算术表达式求值

算上表表达式C语言简易实现

#include<iostream>
#include<cstring>
using namespace std;
const int MAXSIZE=100;
typedef struct stack
{
 char data[MAXSIZE];
 int  top;
}SeqStack;
typedef struct Stack
{
 int data[MAXSIZE];
 int top;
}SeqIntStack;
typedef struct queue
{
 char data[MAXSIZE];
 int rear,front;
}Queue;
//整型栈
void InitIntStack(SeqIntStack *&s)
{
 s=(SeqIntStack*)malloc(sizeof(SeqIntStack));
 s->top=-1;
 memset(s->data,0,sizeof(int));
}
int Pop(SeqIntStack *&s)
{
 if(s->top==-1)
 {
  cout<<"the stack is empty"<<endl;
  return -1;
 }
 return s->data[s->top--];
}
int Push(SeqIntStack *&s,int data)
{
 if(s->top==MAXSIZE-1)
 {
  cout<<"overflow"<<endl;
  return -1;
 }
 s->data[++s->top]=data;
 return 0;
}
int GetIntTop(SeqIntStack *&s)
{
 if(s->top==-1)
 {
  cout<<"no data"<<endl;
 }
 return s->data[s->top];
}
void DeleteIntStack(SeqIntStack *&s)
{
 free(s);
}
///字符栈///
void InitStack(SeqStack *&s)
{
    //memset(s.data,0,sizeof(char));
 s=(SeqStack*)malloc(sizeof(SeqStack));
 memset(s->data,0,sizeof(char));
    s->top=-1;
}
int push(SeqStack *&s,char c)
{
 if(s->top==MAXSIZE-1)
 {
  cout<<"栈满"<<endl;
  return -1;
 }
    s->data[++s->top]=c;
    return 0;
}
char pop(SeqStack *&s)
{
 if(s->top==-1)
 {
  cout<<"栈空"<<endl;
  return '/0';
 }
    return s->data[s->top--];
}
char GetTop(SeqStack *&s)
{
 if(s->top==-1)
 {
  cout<<"取栈顶栈空"<<endl;
  return '/0';
 }
 return s->data[s->top];
}
void deleteStack(SeqStack *&s)
{
  free(s);
}
队列///
void InitQueue(Queue *&q)
{
 q=(Queue*)malloc(sizeof(Queue));
    memset(q->data,0,sizeof(char));
 q->front=q->rear=-1;
// q->front=q->rear=0;//循环队列
 //memset(q.data,0,sizeof(char));
 
}
void Enqueue(Queue *&q,char ch)
{
// if((q->rear+1)%MAXSIZE==q->front)
 if(q->rear+1==MAXSIZE)
 {
  cout<<"队满"<<endl;
  return ;
 }
 //q->rear=(q->rear++)%MAXSIZE;
 (q->rear)++;
 q->data[q->rear]=ch;
}
char Dequeue(Queue *&q)
{
 
 if(q->rear==q->front)
 {
        cout<<"队空"<<endl;
  return '/0';
 }
// q->front=(q->front++)%MAXSIZE;
 (q->front)++;
 return q->data[q->front];
}
void clearQueue(Queue *&q)
{
 free(q);
}
int ComputeResult(char exp[])//此处与char *exp同等效果
{
 int result=0;
 SeqIntStack *operatorStack;
    SeqStack *operandStack;//运算符栈
 Queue *operandQueue;//运算符队列
 InitQueue(operandQueue);
    InitIntStack(operatorStack);
 InitStack(operandStack);
    
 char ch='/0',temp='/0';
 int i=0;
 while((ch=exp[i])!='/0')
 {
  if(ch>='0'&&ch<='9')
  {
   char tempCh[10];
      int j=0;
   tempCh[j++]=ch;
   ch=exp[++i];
            while(ch>='0'&&ch<='9')
   {
       tempCh[j++]=ch;
    ch=exp[++i];
   }
            tempCh[j]='/0';
   Push(operatorStack,atoi(tempCh));
   i--;
  }
  else if(ch=='(')
  {
   push(operandStack,ch);
  }
  else if(ch==')')
  {
           //char temp;
     temp=pop(operandStack);
     while(temp!='('&&temp!='/0')
     {
      Enqueue(operandQueue,temp);
               temp=pop(operandStack);
     }
           
  }
  else if(ch==' ')
  {
  }
  else
  {
           switch(ch)
     {
     case '+':
     case '-':
               //当是+或者-运算符时候将栈中的元素都弹出然后入队
     // temp=GetTop(operandStack);
      temp=pop(operandStack);
               while(temp!='/0'&&temp!='(')
      {
       Enqueue(operandQueue,temp);
       temp=pop(operandStack);
      }
      push(operandStack,ch);
      break;
     case '*':
     case '/':
      //temp=pop(operandStack);
      temp=GetTop(operandStack);
      if(temp=='+'||temp=='-'||temp=='/0')
      {
       push(operandStack,ch);
      }
      else
      {
                  //Enqueue(operandQueue,temp);
       while(!(temp=='+'||temp=='-'||temp=='/0'))
       {
        temp=pop(operandStack);
        Enqueue(operandQueue,temp);
       }   
      }
      break;
     }
  }
  i++;
 }
  ///  while((temp=pop(operatorStack))!='/0')
 //{
 // cout<<temp<<endl;
// }
 while((temp=pop(operandStack))!='/0')
 {
  Enqueue(operandQueue,temp);
 }
 int x,y;
    while((temp=Dequeue(operandQueue))!='/0')
 {
  
  y=Pop(operatorStack);
 // cout<<y<<"  "<<operatorStack->top<<endl;
  x=Pop(operatorStack);
  switch(temp)
  {
  case '+':y=x+y;Push(operatorStack,y);break;
  case '-':y=x-y;Push(operatorStack,y);break;
  case '*':y=x*y;Push(operatorStack,y);break;
  case '/':y=x/y;Push(operatorStack,y);break;
  }
 }
    result=GetIntTop(operatorStack);
    return result;
}
int JudgeTheExpValidity(char exp[])
{
 char ch='/0';
 int i=0;
 SeqStack *s;
 InitStack(s);
 while((ch=exp[i])!='/0')
 {
  if((ch>='0'&&ch<='9')||ch==')'||ch=='('||ch=='+'||ch=='-'||ch=='*'||ch=='/')
  {
           if(ch>='0'&&ch<='9')
     {
             i++;
     }
     else if(ch=='('||ch=='+'||ch=='-'||ch=='*'||ch=='/')
     {
      if(ch=='(')
      {    
       push(s,ch);
      }
      ch=exp[++i];
      if(!(ch>='0'&&ch<='9'))
      {
       cout<<"不符合表达式格式,运算符或者左括号后不是操作数"<<endl;
       return -1;
      }
      else
      {
       i++;
      }
               
     }
     else//ch==')'
     {
      if((ch=pop(s))==')')
      {
                  i++;
      }
      else
      {
       cout<<"没有匹配的做括号"<<endl;
       return -1;
      }
     
     }
  }
  else
  {
   cout<<"表达式中有非法字符"<<endl;
   return -1;
  }
  //i++;
 }
 return 0;
}
int main()
{
 char exp[MAXSIZE];
 cout<<"please input the expression: example || 157+163+167+173+179+181+191+193+197+199+211"<<endl;
 cin>>exp;
    while(true)
 {
  if(-1==JudgeTheExpValidity(exp))
  {
   cout<<"please input the valid expression"<<endl;
   cin>>exp;
  }
  else
  {
   break;
  }
 }
 int result;
    result=ComputeResult(exp);
 cout<<result<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值