关闭

算术表达式

标签: c
478人阅读 评论(0) 收藏 举报
分类:
#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)--];
}
//////////////////////////////////////////////////////////////////////////////////////////

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:252273次
    • 积分:4096
    • 等级:
    • 排名:第7530名
    • 原创:177篇
    • 转载:80篇
    • 译文:0篇
    • 评论:10条
    最新评论