zoukankan      html  css  js  c++  java
  • 算术表达式

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    #define MAXzhansize 30
    char stack[MAXzhansize];//
    char deleted(int *top);
    void add(int *top,char item);
    
    //////////////////////////////////////////////////////////////////////////////////
    ////////////逆波兰数计算
    #define element int
    #define ni_MAXzhansize 20
    
    /////////////+    -    *     /   %  out 数字
    typedef enum{jia,jian,cheng,chu,yu,eos,shuzi}prece;
    int ni_stack[ni_MAXzhansize];
    
    void nisuanadd(int *top,element item);
    element nisuandeleted(int *p);
    int eval();
    prece gettoken(char*symbol,int *n);
    ////////////////////////////////////////////////////////////////////////////
    
    
    char c[30];////结果字符
    void main()
    {
      int a[128];
      a['+']=1;///预备优先级
      a['-']=1;
      a['*']=2;
      a['/']=2;
      a['%']=2;
      a['(']=0;
      a[')']=0;
      a[',']=-1;
      
    int top=-1,j=0;//top始终是指向栈顶元素的
    char b[30];/////原始字符
    
    gets(b);//(2+3*4+5)*(2+3)
      
    add(&top,',');// 最低优先级a[',']=-1;
    
    for(int i=0;b[i]!='';++i)
    {   
       if(!isdigit( b[i]) )///不是数字符号时,若是数字就直接增加数组c中
               {    
    				  if(b[i] == '(' )//前两个if语句 处理特殊情况 一对括号
    				  {
    					add( &top, b[i] );//直接加到栈里'('
    					continue;
    				  }
    
    				 if(b[i] == ')' )//处理一对括号       
    				  {
    					 while( stack[top] != '(' )//输出符号
    					 {
    						c[j++]=deleted(&top);
    						printf("%c",c[j-1]);
    					}
    						deleted(&top);//除掉一个'('
    						continue;
    				  }
    
                        if(a[ b[i] ] > a[ stack[top] ])
            ////当前的符号优先级大于栈顶的符号是放入,,否则弹出栈顶..........
                        {
                            add( &top, b[i] );
                            continue;
                        }
                        else
                        {
                            while(a[ b[i] ] <= a[ stack[top] ])/////输出符号直到大于栈顶符号的优先级
                            {
                               c[j++]=deleted(&top);
                                printf("%c",c[j-1]);
                            }
                           
                            add( &top, b[i] );//把当前的符号加进去
                            continue;
                        }
    
                }
    
       else////是数字符号时
       {
         c[j++]=b[i];
         printf("%c",c[j-1]);
       }
    
    }
     while(top !=0 )/////栈里剩余的符号输出
        {
            c[j++]=deleted(&top);
            printf("%c",c[j-1]);
        }
    c[j++]=' ';//这个空位用于终止
    c[j++]='';////补上空字符
    printf("       ");
    puts(c);
    printf("
    %d",eval());
    
    }
    
    
    void add(int *top,char item)
    {
        if(*top>=MAXzhansize)    
        {
        printf("jj
    ");
            exit(1);
        }
        stack[++*top]=item;
    
    }
    char deleted(int *top)
    {
        if(*top==-1)
        {
        printf("kkkkkkkkkkkkkk
    ");
            exit(1);
        }
        return stack[(*top)--];
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////逆波兰数计算
    int eval()
    {
    	prece token;//符号或数字
    	char symbol;
    	int shu1,shu2;
    	int n=0;
    	int top=-1;
    	token=gettoken(&symbol,&n);
    	while(token!=eos)//不到尾部
    	{
    		if(token==shuzi)
    			nisuanadd(&top,symbol-'0');//是数字就加进去
    		else
    		{///////////////////////否则调用两个数据与符号操作后,再加进去
    			shu2=nisuandeleted(&top);
    			shu1=nisuandeleted(&top);
    			switch(token)
    			{
    			case jia:nisuanadd(&top,shu1+shu2);break;
    			case jian:nisuanadd(&top,shu1-shu2);break;
    			case cheng:nisuanadd(&top,shu1*shu2);break;
    			case chu:nisuanadd(&top,shu1/shu2);break;
    			case yu:nisuanadd(&top,shu1%shu2);break;
    			}
    		}
    		token=gettoken(&symbol,&n);//下一个
    	}
       return nisuandeleted(&top);
    }
    
    prece gettoken(char*symbol,int *n)
    {
    	*symbol=c[(*n)++];//下一个字符
    	switch(*symbol)
    	{
    	case'+':return jia;
    	case'-':return jian;
    	case'*':return cheng;
    	case'/':return chu;
    	case'%':return yu;
    	case' ':return eos;
    	default:return shuzi;
    	}
    }
    
    void nisuanadd(int *top,int item)
    {
    	if(*top>=MAXzhansize)	
    	{
    	printf("jjjjjj
    ");
    		exit(1);
    	}
    	ni_stack[++*top]=item;
    
    }
    int nisuandeleted(int *top)
    {
    	if(*top==-1)
    	{
    	printf("kkkkkkk
    ");
    		exit(1);
    	}
    	return ni_stack[(*top)--];
    }
    //////////////////////////////////////////////////////////////////////////////////////////

  • 相关阅读:
    codevs2034 01串2
    codevs2622数字序列( 连续子序列最大和O(n)算法)
    codevs3008加工生产调度(Johnson算法)
    codevs1955光纤通信(并查集)
    codevs4203山区建小学
    codevs2618核电站问题
    常用端口
    ntp时间同步服务器
    date linux系统校正时间
    用户切换
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6959274.html
Copyright © 2011-2022 走看看