利用栈进行四则混合运算

#include <iostream>
using namespace std;
#include <string>
#define size2 10
#define size1 100
typedef int iii;
typedef struct
{
  char *base;
  char *top;
  int size;
}stack2;
typedef struct
{
  iii * base;
  iii* top;
  int size;
}stack;
void InitStack(stack2 &s)//初始化栈
{
  s.base=(char*)malloc (size1*sizeof(char));
  if(!s.base)
  {
    printf("超出界限\n");
    return;
  }
  else
  {
    s.top=s.base;
    s.size=size1;
  }
}
void InitStack(stack &s)//初始化栈
{
  s.base=(iii *)malloc (size1*sizeof(iii));
  if(!s.base)
  {
    printf("超出界限\n");
    return;
  }
  else
  {
    s.top=s.base;
    s.size=size1;
  }
}
void Insert(stack2 &s ,char a)//插入元素
{
  if(s.top-s.base>=s.size)
  {
    s.base=(char *)realloc (s.base,(s.size+size1)*sizeof (char));
    if(!s.base)
    {
      printf("超出界限\n");
      return ;
    }
  }
  *s.top++=a;
}
void Insert2( stack &s,int a)
{
  if(s.top-s.base>=s.size)
  {
    s.base=(iii *)realloc (s.base,(s.size+size1)*sizeof (iii));
    if(!s.base)
    {
      printf("超出界限\n");
      return ;
    }
  }
  *s.top++=a;
}
char Pop(stack2 &s )//删除栈顶元素,并返回栈顶元素
{
  if(s.top==s.base)
  {
    printf("栈为空\n");
    return 'erro';
  }
  else
  {
    *--s.top;
    return * s.top;
  }
}
int Pop2(stack &s)
{
    if(s.top==s.base)
  {
    printf("栈为空\n");
    return 'erro';//没意义
  }
  else
  {
    *--s.top;
    return * s.top;
  }
}
void View(stack &s)
{
  for(int i=1;i<=(s.top-s.base);i++)
  {
    char k;
    k=*(s.top-i);
    cout<<k<<endl;
  }
}
char GetPop(stack2 &s)
{
  if(s.top==s.base)
  {
    printf("栈为空\n");
    return-1;
  }
  else
    return *(s.top-1);
}
int GetPop2(stack &s)
{
    if(s.top==s.base)
  {
    printf("栈为空\n");
    return-1;
  }
  else
    return *(s.top-1);
}
char Compare(char q,char r)//比较优先级
{
  int j[2];
  char str[2];
  char table[7][7]={
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=','e'},
    {'>','>','>','>','e','>','>'},
    {'<','<','<','<','<','e','='}
  };
  str[0]=q;
  str[1]=r;
  for(int i=0;i<2;i++)
  {
    switch(str[i])
    {
    case '+':j[i]=0;break;
    case '-':j[i]=1;break;
    case '*':j[i]=2;break;
    case '/':j[i]=3;break;
    case '(':j[i]=4;break;
    case ')':j[i]=5;break;
    case '#':j[i]=6;break;
    }
  }
  return table[j[0]][j[1]];
}
int  Operate (int a,char b,int c)
{
  switch(b)
  {
  case '+':
      return a+c;
  case '-':
    return a-c;
  case '*':
    return a*c;
  case '/':
    return a/c;
  }
}
bool Decide(char c)
{
  if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
  return true;
  else
  return false;
}
int main()
{
  stack2 a;
  stack b;//a存储符号,b存储数字
  InitStack(a);
  Insert(a,'#');
  InitStack(b);
  char c;
  c=getchar();
  int temp=0;
  while (c!='#'||GetPop(a)!='#')
  {
    if(!Decide(c))
    {
      temp=(temp*10+c-'0');//可支持数位数字
      c=getchar();
    }
    else if(Decide(c))
    {
      if(temp!=0)
      {
          Insert2(b,temp);
      }
      temp=0;
      switch(Compare(GetPop(a),c))
      {
      case '<':
        //栈顶元素优先权低
        //cout<<"<"<<endl;
        Insert(a,c);
        c=getchar();
        break;
      case '=':
        //脱括号
        Pop(a);
        c=getchar();
        break;
      case'>':
        char f=Pop(a);
        int g=Pop2(b);
        int  h=Pop2(b);
        Insert2(b,Operate(h,f,g));
        break;
      }
    }
  }
  cout<<"结果为"<<endl;
  cout<<GetPop2(b)<<endl;
  return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值