收录日期:2020/12/06 01:53:37 时间:2016/06/09 00:01:24 标签:C语言
#include "stdio.h"
#include <malloc.h>
#include  "stdlib.h" 
#include  "math.h" 
#define max 100

typedef double shulx;
typedef char fulx;

typedef struct 
{shulx data[max];
 int top;
}shuzhi;//放数值栈的结构体

typedef struct 
{fulx data[max];
 int top;
}fuhao;//放符号栈的结构体

void init_o(fuhao *s)
//置符号栈为空栈的函数
{ s->top=-1;
}

int empty_o(fuhao *s)
//判断符号栈s是否为空栈,若为空,返回1,否则返回0
{if (s->top==-1) return 1;
  else return 0;
}

void push_o(fuhao *s,fulx x)
{//符号入栈函数
s->top++;
s->data[s->top]=x;
}

void pop_o(fuhao *s,fulx *x)
//符号出栈函数
{*x=s->data[s->top];
s->top--;
}

fulx gettop_o(fuhao *s)
//取符号栈栈顶元素的函数

 return s->data[s->top];
}

void init_n(shuzhi *s)
//置数值栈为空栈的函数
{ s->top=-1;
}
int empty_n(shuzhi *s)
//判断数值栈s是否为空栈,若为空,返回1,否则返回0
{if (s->top==-1) return 1;
  else return 0;
}

void push_n(shuzhi *s,shulx x)
{//数值入栈函数
s->top++;
s->data[s->top]=x;
}

void pop_n(shuzhi *s,shulx *x)
//数值出栈函数
{*x=s->data[s->top];
s->top--;
}

shulx gettop_n(shuzhi *s)
//取数值栈栈顶元素的函数

 return s->data[s->top];
}

int   super1(char   w) /*返回各种符号的栈内优先级*/   
  { switch(w)
{   
      case   '+':   
      case   '-':   return   2;   
      case   '*':   
      case   '/':   return   3;   
      case   '(':   return   1;   
      case   ')':   return   4;   
      default:   return   0;   
      }   
  }   
  int   super2(char   w) /*返回各符号的栈外优先级*/   
  { switch(w)
  {   
      case   '+':   
      case   '-':   return   2;   
      case   '*':   
      case   '/':   return   3;   
      case   '(':   return   4;   
      case   ')':   return   1;   
      default:   return   0;   
      }   
  }   

   char   precede(char   kk,char   hh) /*比较两个符号的优先级*/   
  {   
  if((super1(kk)==1)&&(super2(hh)==1))   
     return   '=';   
  else 
  if(super1(kk)<super2(hh))   
          return   '<';   
         else  
       return   '>';   
  }  
   

  int   in(char   c1,char   ops[]) /*判断是否在运算符集中*/   
  {int   i;   
  for(i=0;i<7;i++)   
  if(c1==ops[i])   
  return   1;   
  return   0;   
  }   


  double   getnum(char   *ca) /*得到一个完整的数*/   
  {   
  double   number=0,   dr;   
  dr=0.1;   
  while(*ca>='0'&&*ca<='9')
  {   
  number=10*number+(*ca)-'0';   //整数部分的处理
  *ca=getchar();   
  }   
  if(*ca=='.'){   
  *ca=getchar();   
  while(*ca>='0'&&*ca<='9'){   
  number=number+(*ca-'0')*dr;   //小数部分的处理
  dr/=10;   
  *ca=getchar();   
  }   
  }   
  return   number;   //返回一个完整的数
  }   



  double   operate(double   s1,char   tag,double   s2) /*计算*/   
  {   
  switch(tag)
  {   
  case   '+':   return   s1+s2;   
  case   '-':   return   s1-s2;   
  case   '*':   return   s1*s2;   
  case   '/':   if(fabs(s2)==0)//fabs()为求表达式的绝对值函数
{   //除数为零的情况
  printf("除零出错!\n");   
  exit(1); //程序终止函数,在退出之前会关闭所有已经打开的文件,将缓存中的数据写入磁盘,0为正常退出,其他为非正常退出  
  }   
        return     s1/s2;   
  }   
  return   0;   
  }   



  char   c,ff,d; /*d的作用为:负数运算;如:2-(-1),-3+4等*/   
  double   num,num1,num2;   
  static   char   op[]={'+','-','*','/','(',')','\n'};   
  void   main()   
  { shuzhi *numtop;
    fuhao *optop;
numtop=(shuzhi *)malloc(sizeof(shuzhi));
optop=(fuhao *)malloc(sizeof(fuhao));
  optop=NULL;
  numtop=NULL;   
  printf("\n");   
  //do  {   
  d='(';   
  push_o(optop,'\n');   
  printf("请输入正确的运算表达式(回车结束输入):\n");   
  c=getchar();   
  while(c!='\n'||gettop_o(optop)!='\n')
  {   
   if(!in(c,op))
   {   
   num=getnum(&c);   
   push_n(numtop,num);   
   d=c;   
   }  
  else   
  if(d=='('&&c=='-')
  {   
           c=getchar();   
          d=c;   
           num=-getnum(&c);   
           push_n(numtop,num);   
  }   
  else   
    switch(precede(gettop_o(optop),c))
  {   
    case   '<':   
    push_o(optop,c);   
    d=c;   
    c=getchar();   
    break;   
    case   '=':   
    pop_o(optop,&ff);   
    c=getchar();   
    d=c;   
    break;   
    case   '>':   
    pop_o(optop,&ff);   
    pop_n(numtop,&num2);   
    pop_n(numtop,&num1);   
    push_n(numtop,operate(num1,ff,num2));   
    break;   
  }   
  } //while  
  printf("表达式的值为:%f\n",numtop->data[numtop->top]);   }
终于搞定了,原来是自己粗心了,汗~
#include "stdio.h"
#include <malloc.h>
#include  "stdlib.h" 
#include  "math.h" 
#define max 100

typedef double shulx;
typedef char fulx;

typedef struct 
{shulx data[max];
 int top;
}shuzhi;//放数值栈的结构体

typedef struct 
{fulx data[max];
 int top;
}fuhao;//放符号栈的结构体

void init_o(fuhao *s)
//置符号栈为空栈的函数
{ s->top=-1;
}

int empty_o(fuhao *s)
//判断符号栈s是否为空栈,若为空,返回1,否则返回0
{if (s->top==-1) return 1;
  else return 0;
}

void push_o(fuhao *s,fulx x)
{//符号入栈函数
s->top++;
s->data[s->top]=x;
}

void pop_o(fuhao *s,fulx *x)
//符号出栈函数
{*x=s->data[s->top];
s->top--;
}

fulx gettop_o(fuhao *s)
//取符号栈栈顶元素的函数

 return s->data[s->top];
}

void init_n(shuzhi *s)
//置数值栈为空栈的函数
{ s->top=-1;
}
int empty_n(shuzhi *s)
//判断数值栈s是否为空栈,若为空,返回1,否则返回0
{if (s->top==-1) return 1;
  else return 0;
}

void push_n(shuzhi *s,shulx x)
{//数值入栈函数
s->top++;
s->data[s->top]=x;
}

void pop_n(shuzhi *s,shulx *x)
//数值出栈函数
{*x=s->data[s->top];
s->top--;
}

shulx gettop_n(shuzhi *s)
//取数值栈栈顶元素的函数

 return s->data[s->top];
}

int   super1(char   w) /*返回各种符号的栈内优先级*/   
  { switch(w)
{   
      case   '+':   
      case   '-':   return   2;   
      case   '*':   
      case   '/':   return   3;   
      case   '(':   return   1;   
      case   ')':   return   4;   
      default:   return   0;   
      }   
  }   
  int   super2(char   w) /*返回各符号的栈外优先级*/   
  { switch(w)
  {   
      case   '+':   
      case   '-':   return   2;   
      case   '*':   
      case   '/':   return   3;   
      case   '(':   return   4;   
      case   ')':   return   1;   
      default:   return   0;   
      }   
  }   

   char   precede(char   kk,char   hh) /*比较两个符号的优先级*/   
  {   
  if((super1(kk)==1)&&(super2(hh)==1))   
     return   '=';   
  else 
  if(super1(kk)<super2(hh))   
          return   '<';   
         else  
       return   '>';   
  }  
   

  int   in(char   c1,char   ops[]) /*判断是否在运算符集中*/   
  {int   i;   
  for(i=0;i<7;i++)   
  if(c1==ops[i])   
  return   1;   
  return   0;   
  }   


  double   getnum(char   *ca) /*得到一个完整的数*/   
  {   
  double   number=0,   dr;   
  dr=0.1;   
  while(*ca>='0'&&*ca<='9')
  {   
  number=10*number+(*ca)-'0';   //整数部分的处理
  *ca=getchar();   
  }   
  if(*ca=='.'){   
  *ca=getchar();   
  while(*ca>='0'&&*ca<='9'){   
  number=number+(*ca-'0')*dr;   //小数部分的处理
  dr/=10;   
  *ca=getchar();   
  }   
  }   
  return   number;   //返回一个完整的数
  }   



  double   operate(double   s1,char   tag,double   s2) /*计算*/   
  {   
  switch(tag)
  {   
  case   '+':   return   s1+s2;   
  case   '-':   return   s1-s2;   
  case   '*':   return   s1*s2;   
  case   '/':   if(fabs(s2)==0)//fabs()为求表达式的绝对值函数
{   //除数为零的情况
  printf("除零出错!\n");   
  exit(1); //程序终止函数,在退出之前会关闭所有已经打开的文件,将缓存中的数据写入磁盘,0为正常退出,其他为非正常退出  
  }   
        return     s1/s2;   
  }   
  return   0;   
  }   



  char   c,ff,d; /*d的作用为:负数运算;如:2-(-1),-3+4等*/   
  double   num,num1,num2;   
  static   char   op[]={'+','-','*','/','(',')','\n'};   
  void   main()   
  { shuzhi *numtop;
    fuhao *optop;
numtop=(shuzhi *)malloc(sizeof(shuzhi));
optop=(fuhao *)malloc(sizeof(fuhao));
    init_o(optop);
    init_n(numtop);
 
  printf("\n");   
  //do  {   
  d='(';   
  push_o(optop,'\n');   
  printf("请输入正确的运算表达式(回车结束输入):\n");   
  c=getchar();   
  while(c!='\n'||gettop_o(optop)!='\n')
  {   
   if(!in(c,op))
   {   
   num=getnum(&c);   
   push_n(numtop,num);   
   d=c;   
   }  
  else   
  if(d=='('&&c=='-')
  {   
           c=getchar();   
          d=c;   
           num=-getnum(&c);   
           push_n(numtop,num);   
  }   
  else   
    switch(precede(gettop_o(optop),c))
  {   
    case   '<':   
    push_o(optop,c);   
    d=c;   
    c=getchar();   
    break;   
    case   '=':   
    pop_o(optop,&ff);   
    c=getchar();   
    d=c;   
    break;   
    case   '>':   
    pop_o(optop,&ff);   
    pop_n(numtop,&num2);   
    pop_n(numtop,&num1);   
    push_n(numtop,operate(num1,ff,num2));   
    break;   
  }   
  } //while  
  printf("表达式的值为:%f\n",numtop->data[numtop->top]);   }
  /*while(optop->top!=-1) pop_o(optop,&ff);   
  while(numtop->top !=-1) pop_n(numtop,&num);   
  printf("\n继续吗?   [Y/N]\n");   
  c=getchar(); //也可用   c=getch();scanf("%*c");两句来代替  
  }while(c=='Y'||c=='y');   
  }   */
呵呵,没有初始化,top始终是随机值
偶以刚发现:)
jf ,樓上好眼力

寻找最好的上传软件?! 怎样通过程序对Machine.config的值设置 救救我呀! 怎样从unix下的oracle8.17链接到window2000下的SqlServer2000??? 水园拒绝没有文化,低素质的有精神病史的整天咬人的疯狗 怎样从unix下的oracle8.17链接到window2000下的SqlServer2000??? 這次答上問題我再加分,不然下100分也不能解決問題! 相信我的進來... 请教各位,这图应该如何用sqlserver做? 我是初学者,小问题,请高手指点一二,谢谢. 高分请教 delphi中使用 excel 如何增加一个sheet其格式和模版一样 (急) 请问oracleorahome81agent不能启动,怎么办! 请问北京的灵思公司(www.sellinux.com)怎么样,了解内情的说说啊,我想去哪里发展哦 菜鸟提问:各个手机厂家提供的sdk有什么用,如何用? 几个问题同时请教! 请高手看看,如何提高效率 写多个文件? C++ Builder 中控件数组中各控件的事件如果分开处理??? 如何从FORM中调用REPORT程序 请问何为粗粒度对象和细粒度对象? 這次答上問題我再加分,不然下100分也不能解決問題! 相信我的進來... 请教Weblogic+Jb+Sybase11.92如何配置? 请问怎么修改网页的标题啊! 能不能用VFP编一个拨号网络计时(费)软件! 郁闷!女友在北京。明年要去,但她告诉我北京薪水低,房价高?各位来说说行情,散分! 在deliph+mapx下,如何更改图层里的一个图元的颜色和尺寸? Java语言学习手记-线程初步.请高手指点 struts算j2ee的一部分吗? 在DShow中为什么设置采集频率会无效 在同一报表中显示两个表中的数据? 数据库发布和订阅时碰到的共享文件读取问题? ·急呀,怎么把图片存入Ms SQL Server数据库的一个表字段?并且能够读出来发送到手机上?