算术表达式

原创 2015年07月07日 15:54:21
#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)--];
}
//////////////////////////////////////////////////////////////////////////////////////////

相关文章推荐

C++算术表达式

  • 2013年12月21日 10:01
  • 2.61MB
  • 下载

算术表达式求值计算器winform

  • 2013年04月07日 19:11
  • 435KB
  • 下载

数据结构 栈的应用——算术表达式求值

实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数...

算术表达式

  • 2013年06月18日 13:40
  • 5KB
  • 下载

栈的应用:解析算术表达式

类似于 1*2-3+4-(5-6)-2/4 的式子,我们称为算术表达式。下面我们利用栈这种数据结构来解析它,即用栈来辅助计算算术表达式。 首先我们得明确计算规则: 先左后右:从左算到右 先乘除,后加减...

算术表达式求值

  • 2015年09月20日 12:28
  • 186KB
  • 下载

算术表达式

  • 2013年12月17日 22:25
  • 224KB
  • 下载

数据结构-算术表达式-算符优先法

代码还添加了乘方的优先级,自行参考 一开始我写的只能输入个位数,后来想了好久才解决,主要是在判断是否为运算符后,若不是运算符,别急着入栈,用一个标记数组记着,若下一个字符还不是运算符,则利用strc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算术表达式
举报原因:
原因补充:

(最多只允许输入30个字)