算术表达式

#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)--];
}
//////////////////////////////////////////////////////////////////////////////////////////
时间: 2024-12-15 15:37:22

算术表达式的相关文章

python实现算术表达式的词法语法语义分析(编译原理应用)

本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用户自定义变量. 词法分析,检查单词变量是否正确:语法分析,检查算术表达式语法是否正确并输出生成语法树:语义分析,输出四元表达式. 最终效果图: 例如输入: 词法分析结果: 语法分析结果: 语义分析结果: 算术表达式的组成语法如下: 无符号整数 = 〈数字〉{〈数字〉} 〈标识符〉= 〈字母〉{〈字母

堆栈解析算术表达式

利用栈,解析算术表达式问题就立刻变得容易许多.给出的示例代码能解析任何包括+,-,*,/,()和0到9数字组成的算术表达式. 中缀表达式和后缀表达式中缀表达式就是通常所说的算术表达式,比如(1+2)*3-4.后缀表达式是指通过解析后,运算符在运算数之后的表达式,比如上式解析成后缀表达式就是12+3*4-.这种表达式可以直接利用栈来求解. 运算符的优先级 优先级 运算符 1 括号() 2 负号- 3 乘方** 4 乘*,除/,求余% 5 加+,减- 6 小于<,小于等于<=,大于>,大于等

【Scala编程】格式化算术表达式程序

格式化算术表达式程序 为了练习模式匹配的使用,该博文介绍编写格式化算术表达式的程序,最终的呈现结果如下面这个二维布局的数学表达式所示,这里除法运算被垂直打印出来: 1 - * (x + 1) 2 ----------- x 1.5 - + --- 2 x 为了实现这个程序,我们需要做一下工作: 1. 编写一个二维布局库来创建和渲染二维布局元素.这里主要应用Scala面向对象编程的一些方法,通过组合与继承来构建简单部件,进而实现库的设计. 2. 编写一个表达式的格式化类,利用二维布局库来渲染二维字

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想. 这里就介绍使用两个栈来计算表达式的方法. 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据: 一个是符号栈operatorStack,用于存放运算符: b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级: 优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等): 并且对于"("与")",认为两者的优先级相

SDUTOJ 2484 算术表达式的转换(栈)

算术表达式的转换 Time Limit: 1000MS Memory limit: 65536K 题目描述 小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下. 因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑.聪明的你帮他解决吧. 输入 输入一算术表达式,以\'#\'字符作为结束标志.(数据保证无空格,只有一组输入) 输出 输出该表达式转换所得到的前缀式 中缀式 后缀式.分三行输出,顺序

linux基础篇-17,let算术表达式

let算术表达式 let I=$($i+1) sum=$($sum+$i) let I++ let I+1 == LET I++ let sum+=$I

Openjudge-计算概论(A)-简单算术表达式求值

描述: 两位正整数的简单算术运算(只考虑整数运算),算术运算为: +,加法运算:-,减法运算:*,乘法运算:/,整除运算:%,取余运算. 算术表达式的格式为(运算符前后可能有空格):运算数 运算符 运算数 请输出相应的结果. 输入一行算术表达式.输出整型算数运算的结果(结果值不一定为2位数,可能多于2位或少于2位). 样例输入 32+64 样例输出 96思路:使用字符串,从前往后扫,直至结束,把符号提出来,进行运算.注意:输入时一定要用gets(char)库函数,否则会报错的!代码如下: 1 #

算术表达式解析(第三版)词法分析版

以前写过两版算术表达式解析代码,但都是基于栈结构或者树模型的,并不是通用的算法.其实算术表达式解析是最基本的词法分析算法,直到我看了<自制编程语言>里面介绍的递归向下分析法,才明白这种问题的终极解决方案是使用词法分析和语法分析.. //用于词法定界的头文件 token.h 1 #ifndef _TOKEN_H_VERSION_20140930 2 #define _TOKEN_H_VERSION_20140930 3 4 enum TokenKind{ 5 BAD_TOKEN, 6 NUMBE

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著 设置运算符栈和运算数栈辅助分析运算符有限关系. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算. 在识别出运算数的同时,要将其字符序列形式转换成整数形式. 1 /** 2 Function:整数算术表达式求值 3 Date:2014-11-10 4 Author:JackDawson 5 Compiler:gcc version 4.8.1 6 */ 7 #include <iostream> 8 #include

page80-栈用例-算术表达式求值

表达式由括号, 运算符和操作数(数字)组成.我们根据以下4中情况从左到右逐个将这些实体送入栈处理. (1)将操作数压入操作数栈: (2)将运算符压入运算符栈: (3)忽略左括号: (4)在遇到右括号时, 弹出一个运算符,弹出所需数量的操作符,并将运算符和操作符的运算结果压入操作数栈. [地杰斯特拉的双栈算术表达式求值算法] public class Evaluate { public static void main(String[] args) { Stack<String> ops = n