算术表达式

原创 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++实现

以字符串的形式输入一个算术表达式,如何对其进行识别并计算出结果呢?       如果按照普通的算术表达式计算,由于需要考虑到操作符和括号的优先级,实现起来十分麻烦。但是基于逆波兰表达式(也称后缀表达式...
  • llc3239
  • llc3239
  • 2015年09月26日 14:17
  • 878

SQL算术表达式

4. 数学函数   函数名称 参数 示例 说明   abs(数值表达式)   select abs(-23.4)返回 23.4   返回指定数值表达式的...
  • Ltinginger
  • Ltinginger
  • 2017年11月18日 10:57
  • 154

算术表达式求值 - 栈的应用

一、实验目的 1、掌握栈的定义及实现; 2、掌握利用栈求解算术表达式的方法。 二、实验内容 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出...
  • deaidai
  • deaidai
  • 2017年05月16日 17:00
  • 1290

算术表达式求值(顺序栈实现)

一.问题描述
  • zhaishaojiang
  • zhaishaojiang
  • 2014年10月12日 14:41
  • 2574

void * 指针算术运算【-Wpointer-arith】

void * 指针算术运算【-Wpointer-arith】 #ifdef __cplusplus extern "C" { #endif #include #include int...
  • angelzyb
  • angelzyb
  • 2014年03月09日 09:55
  • 1830

栈的操作和c语言实现算术表达式求值

栈是一种特殊的线性表,anzh
  • guihailiuli
  • guihailiuli
  • 2014年11月07日 21:36
  • 4421

用栈对算术表达式求值

假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式。求算术表达式值的过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。   1)将算术表达式e...
  • sanqima
  • sanqima
  • 2015年09月30日 19:30
  • 1723

算法 -- 双栈算术表达式求值算法

算法 – 双栈算术表达式求值算法最近在学习算法时候,看到一个双栈算术表达式求值算法,挺启发我的;平常大家在写代码的时候要写表达式的时候,基本都是直接 (1 + ( ( 2 + 3 ) * ( 4 * ...
  • erzhanchen
  • erzhanchen
  • 2017年02月26日 17:53
  • 232

Shell 脚本中的算术运算与常用条件表达式

1. CShell 脚本第一行: #! /bin/sh   这一行一定写对,否则可能认为是批处理。 2. 算术展开: 算术表达式置于$((  ))中即可。 运算符包括:"++", "...
  • ccwwff
  • ccwwff
  • 2012年05月16日 13:46
  • 2003

【经典算法】-算术表达式求值

算术表达式求值 中缀表达式 我们平时写的计算式的式子一般是这样子 格式:"操作数1 操作符 操作数2" 12 * (3 + 4) - 6 + 8 / 2; // 中缀表达式 ...
  • dream_1996
  • dream_1996
  • 2017年09月28日 18:20
  • 763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算术表达式
举报原因:
原因补充:

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