⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11.c

📁 c语言环境 进站出站的算法设计 很简单的
💻 C
字号:
#include <stdio.h> 
#include <malloc.h> 
#include <math.h> 
#include <string.h> 
#include <ctype.h> 
#define M 40 
/*定义堆栈*/ 
typedef struct{ 
double data[M]; 
int top; 
}Stack; 
/*初始化堆栈*/ 
InitStack(Stack *s) 
{ 
s->top=0; 
} 
/*判断栈是否为空*/ 
int StEmpty(Stack *s) 
{ 
if(s->top==0) 
{ 
   return 1; 
} 
else 
{ 
   return 0; 
} 
} 
/*入栈操作*/ 
StPush(Stack *s,double x) 
{ 
  if(s->top==M) 
  { 
   printf("The stack is overflow!"); 
  } 
  else 
  { 
   s->top=s->top+1; 
   s->data[s->top]=x; 
  } 
} 
/*出栈操作*/ 
double StPop(Stack *s) 
{ 
  double t; 
  if(!StEmpty(s)) 
  { 
   t=s->data[s->top]; 
   s->top=s->top-1; 
  } 
   else 
  { 
   printf("StPop:The stack is empty!"); 
   t=NULL; 
  } 
  return t; 
} 
/*获取栈顶元素*/ 
double StGetTop(Stack *s) 
{ 
  double t; 
  if(!StEmpty(s)) 
  { 
   t=s->data[s->top]; 
  } 
  else 
  { 
   printf("StGeTop:The stack is empty!"); 
   t=NULL; 
  } 
  return t; 
} 
/*将数字字符转换成整形*/ 
int ChrTransferint(char c) 
{ 
  int n; 
  switch(c) 
  { 
    case '0': n=0;break; 
    case '1': n=1;break; 
    case '2': n=2;break; 
    case '3': n=3;break; 
    case '4': n=4;break; 
    case '5': n=5;break; 
    case '6': n=6;break; 
    case '7': n=7;break; 
    case '8': n=8;break; 
    case '9': n=9;break; 
  } 
   return n; 
} 
/*获取两个操作符之间数字字符的个数,返回的是最后一个数字字符的位置*/ 
int GetNumsize(char str[],int n1) 
{ 
  int n2=n1; 
  while(isdigit(str[n2])||(str[n2])==46)/*isdigit()判断是否数字字符*/ 
  { 
   n2=n2+1; 
  } 
  return n2; 
} 
/*判断上个函数中获得的数字字符串中是否包含小数点,并返回它的位置,不包含,返回-1*/ 
int IsIncludepoint(char str[],int n1,int n2) 
{ 
  int n3=-1; 
  int i; 
  for(i=n1;i<=n2;i++) 
  { 
    if(str[i]=='.') 
     { 
       n3=i; 
       break; 
     } 
  } 
  return n3; 
} 
/*将数字字符转换成数值*/ 

/*主程序*/ 
main() 
{ 
  char str[M],c; 
  char a; 
  int n,p1,p2,p3;    /*n为字符串长度,p1,p2,p3分别为数字字符起始位置,结束位置,和小数点位置*/ 
  double data;      /*存放转换后的数值*/ 
  int i=0; 
  Stack *so=(Stack *)malloc(sizeof(Stack));   /*存储操作符 '(':1,'+':2,'-':3, '*':4,'/':5  字符'),='不压栈*/ 
  Stack *sd=(Stack *)malloc(sizeof(Stack));   /*存储操作数*/ 
  InitStack(so); 
  InitStack(sd); 
  printf("Please input formula(format:1+2=:\n"); 
  n=0; 
  while((a=getchar())!='\n') 
  { 
    str[n]=a; 
    n++; 
  } 
  while(i<n) 
   { 
     char c; 
     c=str[i]; 
     if(c=='(') 
      {                                         /*c若是'('直接入栈so,i++*/ 
        StPush(so,1); 
        i++; 
      } 
     else if(isdigit(c)) 
      { 
        p1=i;                            /*c若是数字字符,一并将后面的连续数字字符转换为数值并压栈到sd,并把i设为后面的*/ 
p2=GetNumsize(str,p1); 
p3=IsIncludepoint(str,p1,p2-1);  /*第一个非数字字符的位置*/ 
data=Transfer(str,p1,p2-1,p3); 
        StPush(sd,data); 
        i=p2; 
      } 
     else if(c=='+') 
       { 
StPush(so,2);          /*c若是'+'直接入栈so,i++*/ 
        i++; 
       } 

     else if(c==')') 
       { 
        double t1,t2,t3; 
        int p; 
        while((p=StPop(so))!=1&&!StEmpty(so))  /*c若是')',出栈so,判断是'+',出栈sd两个操作数,进行加减运算*/ 
         {                                     /*直到StPop=='('*/ 
           t1=StPop(sd); 
           t2=StPop(sd); 
           if(p==2) 
           { 
             t3=t2+t1; 
             StPush(sd,t3); 
           } 
           else if(p==3) 
           { 
             t3=t2-t1; 
             StPush(sd,t3); 
           } 
         } 
     else if(c=='=') 
       { 
  double t1,t2,t3;            /*c若是'=',这是so内只有加减号,出栈so到p ,sd到t1,t2*/ 
  int p; 
         while(!StEmpty(so)) 
          { 
           t1=StPop(sd); 
           t2=StPop(sd); 
    p=StPop(so); 
           if(p==2) 
           { 
             t3=t2+t1;             /*p=='+',加法运算,并将结果t3压栈sd*/ 
             StPush(sd,t3); 
           } 
           
if(!StEmpty(so)||StEmpty(sd)) 
{ 
  printf("Input error,Back!\n");  /*若so不为空,或者sd为空,且sd中只有一个元素,则输入的式子不对*/ 
} 
else 
{ 
  double end; 
  int i;                                  /*否则,sd中的那个数据就是最后计算结果,打印输出*/ 
  end=StGetTop(sd); 
  printf("The value of this formula:\n"); 
  for(i=0;i<n;i++) 
   { 
     printf("%c",str[i]); 
   } 
  printf("%f\n",end); 
} 

} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -