表达式求值(栈实现)

 第一次接触数据结构的时候写的,刚开始懵懵懂懂,写得乱七八糟,不过还是写出来了,以下是源代码

 

//zhan1.cpp

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"zhan1.h"
void main()
{
 printf("            -----------栈的功能演示:-----------------08/12/5/n");
 char m[10]={'a','b','c','d','e','f','g'};
 char m1;
 int j;
 printf("please input the char:/n");
 for(j=0;m[j]!='/0';printf(" %c " ,m[j]),j++);
 stack T;
 printf("/n初始栈T:/n");
 Init(&T);
 printf("元素入栈T:/n");
 j=0;
 if(StackEmpty(&T))
 {
  printf("栈T存在!!/n");
  while(m[j]!='/0')
  {
   Push(&T,m[j]);
   j++;
  }
  printf("元素出栈:/n");
  printf("/n栈T长度为:%d",stacklength(&T));
  ClearStack(&T);
  printf("栈T长度为:%d",stacklength(&T));
  printf("/n摧毁栈!!/n");
  Destory(&T);
 }
 else
 {
  printf("此栈不存在!!");
 }

 


 printf("/r/n-----------The simple example for formular evaluation---------08/12/5/n/n");
 char formular[25];
 char number1[5];
 int i=0;
 int tag=0; //判断是否是首次执行
 int b=0;
 int k1=0,k2=0;
 int k;
 double d=0,h=0;  //存表达式出现负数小数情况
 char a;
 stack L;   //临时栈,存暂未被取用的符号
 stack S;   //存后缀表达式
 Init(&L);
 Init(&S);
 printf("please input formular(The number must less than 10):/n");
 gets(formular);
 //将中缀表达式转化成后缀表达式
 while(formular[i]!='/0')
 { 
  if(is_operator(formular[i]))
  {
   if(tag==0)Push(&L,formular[i]);
   if(formular[i]!=')')
   {
    Pop(&L,&a);
    if(operator_grade(formular[i])<operator_grade(a))
    {
     if(a!='(')Push(&S,a);
     Push(&L,formular[i]);
    }
    else
    {
     Push(&L,a);
     Push(&L,formular[i]);
    }
   }//if(formular[i])!=')')
   else
   {
    for(Pop(&L,&a);(L.cout>0)&&(a!='(');Push(&S,a),Pop(&L,&a));
   }
   tag++;
  }//if(is_operator(formular[i]))
  else
  {
   Push(&S,formular[i]);
  }
  i++;
 }
 //在(后留在栈中的运算符放在
 for(Pop(&L,&a);L.cout>0;Push(&S,a),Pop(&L,&a));
 printf("/nThe postfix fomular is:/n");
 for(i=0;S.cout>0;Pop(&S,&a),formular[i]=a,i++);
 formular[i]='/0';
 b=strlen(formular); //存后缀式的长度
 for(i=b-1;i>=0;printf("%c",formular[i]),i--);
 //算出表达式的值
 i=b-1;
 while(i>=0)
 {
  while(!is_operator(formular[i]))
  {
   Push(&S,formular[i]);
   Push(&S,'!');
   i--;
  }
  Pop(&S,&a);//删除!符号
  if(a!='!')Push(&S,a);
  k1=winnumber(&S,&a,number1);
  Pop(&S,&a);//删除!符号
  if(d)
  {
   h=operad(k1,d,formular[i]);
   d=h;
   if(i==0)printf("/nThe result is:%.3f/n",d);
  }
  else
  {
   k2=winnumber(&S,&a,number1);
   if(is_special_code(formular[i])&&(k2<k1))
   {
//    printf("/n调用判断是否是/或者-");
    d=operad(k2,k1,formular[i]);
    if(i==0)printf("/nThe result is:%.3f/n",d);
   }
   else
   {
    k=opera(k2,k1,formular[i]);
    if(i==0)printf("/nThe result is:%d/n",k);
    innumber(&S,k);
    Push(&S,'!'); //各个数据隔开标志
   }
  }
  i--;
 }
}

 

//zhan1.h

#define MAX 100
typedef struct stack{
 int cout;
 char data[MAX];
}stack;
//初始化栈
int Init(stack *L)
{
 *L->data=(char)malloc(sizeof(stack));
 if(!L->data){printf("内存分配出错!!");exit(0);}
 L->cout=0;
 L->data[L->cout]='#';
 return 0;
}
//初始元素e入栈
int Push(stack *L,char e)
{
 L->data[L->cout++]=e;
 return 0;
}
//初始元素c出栈
int Pop(stack *L,char *c)
{
 *c=L->data[--L->cout];
// printf("%c",c);
 return 0;
}
//返回栈的长度
int stacklength(stack *L)
{
 char c;
 int i=0;
 while(L->cout>0)
 {
  ++i;
  Pop(L,&c);
  printf(" %c ",c);
 }
 return i;
 
}
//判断是否是空栈
int StackEmpty(stack *L)
{
 if(L->cout>=0)return 1;
 else return 0;
}
//清栈
int ClearStack(stack *L)
{
 if(L->cout>=0)
 {
  L->cout=0;
  L->data[L->cout]='#';
  printf("/n清栈成功!!!/n");
  return 0;
 }
 else
 {
  printf("/n此栈不存在!!/n");

 return 1;
 }
}
//摧毁栈
int Destory(stack *L)
{
 if(L->cout>=0)
 {
  L->cout=0;
  L->data[L->cout]=NULL;
  return 0;
 }
 else
 {
  printf("/n此栈不存在!!/n");
  return 1;
 }

}

//判断是否是运算符
int is_operator(char op)
{
 switch(op)
 {
 case'+':
 case'-':
 case'*':
 case'/':
 case'(':
 case')':return 1;
 default:return 0;
 }
}
//判断是否是/或者-
int is_special_code(char str)
{
 if(str=='/'||str=='-')return 1;
 else return 0;
}
//判断运算符的优先级
int operator_grade(char op)
{
 switch(op)
 {
 case'+': case'-':return 1;
 case'*': case'/':return 2;
 case'(': case')':return 3;
 default:return 0;
 }
}
//将b与c进行str3运算
int opera(int b,int c,char str3)
{
 int n;
 if(str3=='+')n=b+c;
 if(str3=='-')n=b-c;
 if(str3=='*')n=b*c;
 if(str3=='/')n=b/c;
 return n;
}
//将a与b进行str3运算(小数和负数类)
double operad(double a,double b,char str3)
{
 double n;
 if(str3=='+')n=a+b;
 if(str3=='-')n=a-b;
 if(str3=='*')n=a*b;
 if(str3=='/')n=a/b;
 return n;
}
int numberchar(char number[5])
{
 char number1[5];
 for(int i=0,j=strlen(number)-1;j>=0;number1[i++]=number[j--]);
 number1[i]='/0';
 return atoi(number1);
}
//取出连续的数字字符转换成正序数字
int winnumber(stack *L,char *c,char number1[5])
{
 int i;
 Pop(L,c);
 for(i=0;*c>='0'&&*c<='9';number1[i++]=*c,Pop(L,c));
 number1[i]='/0';
 Push(L,*c); //将最后出栈不是数字的字符重新推入栈中
// puts(number1);
// printf("%d",numberchar(number1));
 return numberchar(number1);
}
//将数字转换一个个字符存入栈中
int innumber(stack *L,int k)
{
 int i;
 char a;
 for(i=10;(k/i)>=10;i*=10);
 for(;i>=10;a=k/i+48,Push(L,a),k%=i,i/=10);
 a=k+48;
 Push(L,a);
 return 0;
}
//如果是*或者/的话就把它拿出来
char getachar(stack *L,char *c)
{
 Pop(L,c);
 if(*c=='*'||*c=='/'){return *c;}
 else{Push(L,*c);return 0;}  
}

 

你可能感兴趣的:(数据结构,c,struct,Opera,less,input)