1. 程式人生 > >算術表達式

算術表達式

clas ont 數據 ctype -- ++i main track efault

#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]!=‘\0‘;++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++]=‘\0‘;////補上空字符
printf("       ");
puts(c);
printf("\n%d",eval());

}


void add(int *top,char item)
{
    if(*top>=MAXzhansize)    
    {
    printf("jj\n");
        exit(1);
    }
    stack[++*top]=item;

}
char deleted(int *top)
{
    if(*top==-1)
    {
    printf("kkkkkkkkkkkkkk\n");
        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\n");
		exit(1);
	}
	ni_stack[++*top]=item;

}
int nisuandeleted(int *top)
{
	if(*top==-1)
	{
	printf("kkkkkkk\n");
		exit(1);
	}
	return ni_stack[(*top)--];
}
//////////////////////////////////////////////////////////////////////////////////////////

算術表達式