精华内容
下载资源
问答
  • 用两种方式实现表达式自动计算 - PAGE 2 - 设计思想 计算算术表达式可以用两种方法实现 1.中缀转后缀算法 此算法分两步实现先将算术表达式转换为后缀表达式然后对后缀表达式进行计算具体实现方法如下 中缀转后缀 ...
  • 表达式计算C语言实现

    2010-10-18 23:58:52
    本程序利用了栈这么一个常用的数据结构实现了算术表达式中缀与后缀的转换,以及完成了计算
  • 精品文档 一设计思想 计算算术表达式可以用两种方法实现 1.中缀转后缀算法 此算法分两步实现先将算术表达式转换为后缀表达式然后对后缀表达式进行计算具体实现方法如下 1中缀转后缀 需要建一个操作符栈op和一个字符...
  • } int account(char a[],DataType *result) /*表达式计算*/ { int i,j = 0,f = 0,k = 0,n = 100; char b[20]; /*用来记录数字串*/ DataType temp = 0,temp1 = 0,temp2 = 0; /*临时数据变量*/ operastack *opera;...

    #include"stdlib.h"

    typedef double DataType;   /*数据存放类型*/

    typedef int OpType;        /*运算符存放类型*/

    char *code = "+-*/()#";    /*运算符串*/

    char priority[7][7] = {'>','>','','>',

    '>','>','','>',

    '>','>','>','>','','>',

    '>','>','>','>','','>',

    '',

    '>','>','>','>', 0 ,'>','>',

    0 , 0 , 0 , 0 , 0 , 0 , 0 };      /*算符优先表*/

    DataType Add(DataType a,DataType b)   /*加*/

    {

    return a+b;

    }

    DataType Sub(DataType a,DataType b)   /*减*/

    {

    return a-b;

    }

    DataType Mul(DataType a,DataType b)   /*乘*/

    {

    return a*b;

    }

    DataType Div(DataType a,DataType b)   /*除*/

    {

    return a/b;

    }

    DataType (*func[])(DataType,DataType)={Add,Sub,Mul,Div};

    typedef struct

    {

    int top;                                                   /*数据栈*/

    int max;       /*最大长度*/

    DataType *stack;

    }datastack;

    typedef struct

    {

    int top;                                                   /*运算符栈*/

    int max;      /*最大长度*/

    OpType *stack;

    }operastack;

    int DataPush(datastack *s,DataType a)                          /*数据入栈*/

    {

    if(s->top == s->max)

    return 0;

    s->stack[s->top]=a;

    s->top++;

    return 1;

    }

    int DataPop(datastack *s,DataType *d)         /*数据出栈*/

    {

    if(s->top == 0)

    return 0;

    s->top--;

    *d = s->stack[s->top];

    return 1;

    }

    int OperaPush(operastack *s,OpType a)                         /*运算符入栈*/

    {

    if(s->top == s->max)

    return 0;

    s->stack[s->top]=a;

    s->top++;

    return 1;

    }

    int OperaPop(datastack *s,OpType *op)        /*运算符出栈*/

    {

    if(s->top == 0)

    return 0;

    s->top--;

    *op = s->stack[s->top];

    return 1;

    }

    datastack * CreateDataStack(int n)         /*创建数据栈*/

    {

    datastack *data = (datastack *)malloc(sizeof(datastack));

    if(!data)

    return 0;

    data->stack = (DataType *)malloc(sizeof(DataType)*n);

    if(!data->stack)

    {

    free(data);

    return 0;

    }

    data->top = 0;

    data->max = n;

    return data;

    }

    operastack * CreateOperaStack(int n)     /* 创建运算符栈*/

    {

    operastack *opera = (operastack *)malloc(sizeof(operastack));

    if(!opera)

    return 0;

    opera->stack = (OpType *)malloc(sizeof(OpType)*n);

    if(!opera->stack)

    {

    free(opera);

    return 0;

    }

    opera->top = 0;

    opera->max = n;

    return opera;

    }

    int account(char a[],DataType *result)                                     /*表达式计算*/

    {

    int i,j = 0,f = 0,k = 0,n = 100;

    char b[20];     /*用来记录数字串*/

    DataType temp = 0,temp1 = 0,temp2 = 0;  /*临时数据变量*/

    operastack *opera;

    datastack *data;

    data = CreateDataStack(n);

    if(!data)

    return 0;

    opera = CreateOperaStack(n);

    if(!opera)

    return 0;

    for(i=0;i

    {

    if(a[i] == ' ')    /*遇空格则不作处理,直接跳过*/

    continue;

    if(a[i]>='0'&&a[i]<='9'||a[i] == '.')

    {

    b[j++] = a[i];

    f=1;          /*表示有待入栈数据*/

    }

    else

    {

    if(f)

    {

    b[j] = 0;

    j = 0;

    if(!DataPush(data,atof(b)))    /*数据入栈*/

    {

    printf("Expression error!\n");

    return 0;

    }

    f=0;

    }

    for(k=0;a[i]!=code[k];k++);   /*找出运算符在运算符字符串中的位置*/

    if(opera->top == 0)   /*运算符栈为空*/

    {

    if(k == strlen(code)-1)  /*遇#,表达式结束*/  /*所有计算均已完成,返回结果*/

    *result = data->stack[--(data->top)];

    if(!OperaPush(opera,k))   /*运算符入栈*/

    {

    printf("Expression error!\n");

    return 0;

    }

    }

    else

    {    /*对待入栈运算符与栈顶运算符进行优先级比较*/

    if(priority[opera->stack[opera->top-1]][k] == '>')   /*栈顶运算符优先级高,进行计算*/

    {

    while(1)

    {

    if(opera->stack[opera->top-1] == 5)    /*出现右括号*/

    {

    opera->top--;

    continue;

    }

    else if(opera->stack[opera->top-1] == 4)   /*出现左括号*/

    {

    opera->top--;

    i--;           /*继续下一字符判断*/

    break;

    }  /*计算,数据栈出栈栈顶两个数,运算符栈出栈一个运算符*/

    if(!DataPop(data,&temp1))

    {

    printf("Expression error!\n");

    return 0;

    }

    if(!DataPop(data,&temp2))

    {

    printf("Expression error!\n");

    return 0;

    }

    temp = func[opera->stack[--(opera->top)]](temp2,temp1);

    DataPush(data,temp); /*将计算结果入栈*/

    i--;  /*继续下一字符判断*/

    break;

    }

    }

    else     /*栈顶运算符优先级低,新运算符入栈*/

    OperaPush(opera,k);

    }

    }

    }

    return 1;

    }

    展开全文
  • c语言中缀表达式计算

    2015-01-03 18:15:23
    利用c语言写的中缀表达式,主要数据结构是栈。
  • 设计一个能够计算表达式的程序,要求能够对包含加、减、 乘、除、括号运算符、与或非运算法运算符的表达式能够检查表达式是否合法,对于错误的表达式要能够给出错误的原因
  • 计算后缀表达式——C语言实现

    千次阅读 2018-07-07 17:56:49
    //创建一个新栈,用于计算n的阶乘 Stack m; Createstack(m); float i,n,item = 1; printf("请输入一个数字:"); scanf("%f",&n) ; for (float i = n; i >= 1; i--) push(m, i); while (m.top != m...

    程序相对简单易懂,运行程序,

    在命令行中输入:123+*#(注意:由于输入字符,以‘#’结束)

    输出:5.000000

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct
    {
    	float *base;
    	float *top;
    	int StackSize;
    }Stack;
    
    //创建一个栈,100为Maxsize,#define无法定义 
    void Createstack(Stack &s)
    {
    	s.base=(float *)malloc(100 * sizeof(float));
    	s.top=s.base;
    	s.StackSize=100;
    	
    }
    
    //栈顶指针 
    float top(Stack s)
    {
    	if(s.top==s.base)
    	{
    		return -1;
    		printf("error!\n");
    		//栈满               
    	}
    	return *(s.top-1);
    }
    
    // 入栈程序 
    void push(Stack &s,float elem)
    {
    	if(s.top-s.base>=s.StackSize)
    	{
    		//扩展栈空间 
    		s.base=(float *)realloc(s.base,(s.StackSize+10)*sizeof(float));
    		s.top=s.base+s.StackSize;
    	    s.StackSize+=10;
    	}
    	 *s.top++ = elem;
    }
    
    //出栈程序 
    void pop(Stack &s)
    {
    	if(s.top==s.base)
    	{
    		//栈空 
    		printf("error!\n");
    		return ;
    	}
    	s.top--;
    }
    
    //判断输入运算符 
    int operate(char c)
    {
    	switch(c)
    	{
    	case '+' :return 1;
    	case '-' :return 1;
    	case '*' :return 1;
    	case '/' :return 1;
    	default :return 0;
    	}
    }
    
    //输入表达式 
    float cal(float a,float b,char c)
    {
    	switch(c)
    	{
    	case '+' :return a+b;
    	case '-' :return a-b;
    	case '*' :return a*b;
    	case '/' :return a/b;
    	}
    }
    
    //主函数 
    int main()
    {
    	float a,b,result;
    	Stack s;
    	Createstack(s);
    	char c1='0';
        printf("输入后缀表达式:"); 
    	while(c1!='#')
    	{
    		c1=getchar();
    
    		if(!operate(c1))
    		{
    			
    			push(s,(float) (c1-48));
    		}
    		else
    		{
    			b=top(s);
    			pop(s);
    			a=top(s);
    			pop(s);
    			result=cal(a,b,c1);
    			push(s,result);
    		}
    	
    	}
    	printf("%f\n",result);
    	system("pause");
    
    	//创建一个新栈,用于计算n的阶乘 
    	Stack m;
    
    	Createstack(m);
    
    	float i,n,item = 1;
    
    	printf("请输入一个数字:");
    
    	scanf("%f",&n) ;
    
    	for (float i = n; i >= 1; i--)
    
    		push(m, i);
    
    	while (m.top != m.base){
    
    		item= top(m) * item;
    
    		pop(m);
    
    	}
    
        printf("n的阶乘为:");
    
    	printf("%f",item) ;
    
    
    	return 0;
    }
    

    展开全文
  • 精品文档一、设计思想计算算术表达式可以用两种方法实现:1.中缀转后缀算法此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:(1)中缀转后缀需要建一个操作符栈op和...

    精品文档

    一、设计思想

    计算算术表达式可以用两种方法实现:

    1.中缀转后缀算法

    此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下:

    (1)中缀转后缀

    需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。

    如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符\0。我们就得到了后缀表达式。

    (2)后缀表达式计算

    此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。

    2.两个栈实现算法

    此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。

    当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中;当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。

    如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符\0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。

    二、算法流程图

    第一种算法:中缀转后缀算法

    精品文档.

    精品文档

    其主函数流程图为:

    得到用户输入的中缀表达式返回计算结果函数trans调用得到后缀表达调calculat函计算表达式

    图1 主函数算法流程图

    中缀转后缀算法流程图如下:

    如果是操作取得字符符或括号判断是操作判断是哪直接放入如果是右括号并在其后加入符取出栈顶元素比栈顶优先级高若栈顶元素不为(

    进行判断如果是操作符与栈顶比较得到用户输入的中缀表达式

    如果是括号如果是左括号直接入操作符栈exp

    符还是括号数组中exp分隔#入操作符栈

    个括号

    不高于栈顶优先级出栈存入数组中

    优先等级

    放入exp数组中

    中缀转后缀算法流程图2 图

    精品文档.

    精品文档

    计算后缀表达式流程图如下:

    得到后缀表达式如果是数字或小数点如果为操作符判断是否为操作符截取子串并将double其转化成从值栈取出两个类型,存入值数值,计算结果栈中并存入值栈中取出最终值栈中的数值,作为返回值

    3 后缀表达式计算流程图图

    第二种算法:两个栈算法

    其主函数流程图为:

    返回计算结果调用calculate函数计算表达式

    图4 主函数算法流程图

    精品文档.

    精品文档

    直接计算数学表达式流程图如下:

    得到存放中依次取出数组中str缀表达式的数组的每个字符判断字截取子串并将其转化符类型类型,并将double成其存入值栈中取出值栈的两个数值,计算结果后存取出值栈的两个数值,计算结果后存入值栈中

    如果是操作如果是符或是括号判断是操作操作符与栈顶比不高于栈顶优先级判断是哪入操作符个括号栈取出值栈的两个数如果是右括号值,计算结果后存入值栈中取出栈顶元素素是否为(符号栈是否为空

    如果是数字或小数点如果是左括号直接入操作符栈入值栈中

    符还是括号如果是括号是为空

    较优先级

    栈非空

    不是

    栈顶元

    pop出左括号取出值栈中的数

    值作为返回

    图5 直接计算表达式流程图

    三、源代码

    下面给出的是用中缀转后缀算法实现的程序的源代码:

    #incl

    展开全文
  • 扫一遍表达式求值的基本思路是:用两个栈(一个字符栈、一个数字栈)边扫描边计算,最后在数字栈中所得的数就是计算结果。 算法二: 扫两遍表达式求值的基本思路是:先将中缀表达式转化为后缀表达式,再通过计算...
  • 表达式计算器C语言

    热门讨论 2009-08-19 10:54:26
    采用C语言编写的表达式计算器 输入表达式进行求值 支持加减乘除四则运算 支持直接在算式里输入负号 支持先乘除后加减 如输入1+3*96+5*8*9/2+37 输出506.00000
  • 逆波兰表达式 这个主要是对栈的应用,如果不了解栈的同学先去了解一下栈哦,如果了解了,就当这句话不存在; 是数字的话直接入栈; 遇到运算符的话出栈2个数字进行运算,前者对后者进行运算; 运算后的结果...

    逆波兰表达式

    • 这个主要是对栈的应用,如果不了解栈的同学先去了解一下栈哦,如果了解了,就当这句话不存在;

    • 是数字的话直接入栈;

    • 遇到运算符的话出栈2个数字进行运算,前者对后者进行运算;

    • 运算后的结果继续入栈;

    • 下面给出代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<ctype.h>
    #include<math.h>
    
    #define STACK_INIT_SIZE 200
    #define STACKINCREMENT 100
    
    typedef double Elemtype;
    typedef struct {
    	Elemtype *base;
    	Elemtype *top;
    	int stackSize;
    	
    }sqStack;
    
    void InitStack (sqStack *s) {
    	s->base =(Elemtype *)malloc (STACK_INIT_SIZE * sizeof(Elemtype));
    	s->top =s->base ;
    	s->stackSize =STACK_INIT_SIZE;
    	
    }
    
    void Push (sqStack *s, Elemtype e) {
    	if(s->top -s->base  >=s->stackSize )  {
    		s->base = (Elemtype *)realloc (s->base ,(s->stackSize +STACKINCREMENT* sizeof(Elemtype)));
    	}
    	
    	*(s->top )=e;
    	s->top ++;
    	
    }
    
    void Pop(sqStack *s,Elemtype *e) {
    	if(s->top ==s->base ) return ;
    	*e= *--(s->top );
    	
    }
    
    int StackLen (sqStack s) {
    	return (s.top - s.base );
    	
    }
    
    int main() {
    	sqStack s;
    	char c;
    	double d,e;
    	char str[STACKINCREMENT];
    	int i=0;
    	
     	InitStack (&s);
    	printf("请按逆波兰表达式输入计算数据,用空格隔开,以“#”结束\n");
    	scanf("%c",&c);
    	while(c!='#') {
    		while( isdigit(c) || c=='.') {
    			str[i++]=c;
    			str[i]='\0';
    			
    			scanf("%c",&c);
    			if(c==' ') {
    				d=atof(str);
    				Push(&s,d);
    				i=0;
    				break;
    			}
    		} 
    		switch (c) {
    			case '+':
       				    Pop(&s,&e);
    					Pop(&s,&d);
    					Push(&s,d+e);
    					break;
    			case'-':
    				    Pop(&s,&e);
    				    Pop(&s,&d);
    				    Push(&s,d-e);
    				    break;
                case'*':
                	Pop(&s,&e);
                	Pop(&s,&d);
                	Push(&s,d *e);
                	break;
               	case'/':
               		Pop(&s,&e);
                	Pop(&s,&d);
                	if(e!=0) {
                		Push(&s,d/e);
    				}
                	else {
                		printf("除数是0!\n");
                		return -1;
                		
    				}
    				break;	 
    		}
    		scanf("%c",&c);
    		
    	}
    	Pop(&s,&d);
    	
    	printf("最终结果为 %f\n",d);
    
    }
    
    

    isdight()函数是判断字符是否为十进制数字字符,在头文件<ctype.h>里面;
    atof ()函数是将字符串化为浮点型,在头文件<stdlib.h>里面;

    展开全文
  • C语言计算前缀表达式

    2019-10-06 21:11:22
    请设计程序计算前缀表达式的结果值。 输入格式: 输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。 输出格式: 输出前缀表达...
  • 表达式运算(C语言实现)

    千次阅读 2021-05-23 03:00:01
    } else if(x==3) { printf("判断表达式的括号是否匹配并计算表达式的值\n"); printf("%d\n",EvaluateExpression()); } else if(x==4) { break; } else { printf("输入的为非法字符"); break; } } }
  • 后缀表达式什么是后缀表达式后缀表达式计算功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 中缀表达式计算 c语言链表实现

    多人点赞 2020-06-20 17:34:34
    中缀表达式计算 c语言链表实现 1题目 输入一个中缀算术表达式计算其结果。对输入的表达式,做如下假设: (1)只考虑+、-、*、/这四种运算符,中缀表达式中只有一种括号(); (2)输入的中缀表达式中数字只有...
  • C语言-计算表达式

    千次阅读 2019-02-01 19:17:09
    //计算表达式 #include&lt;stdio.h&gt; #include&lt;ctype.h&gt; #include&lt;stdlib.h&gt; #define MAX_SIZE 128 struct OP { int type;//0 union{char symbol;double val;}value;//...
  • Lambda表达式C语言

    2021-05-23 07:45:02
    前言先来啰嗦几句,身边的朋友,同事都喜欢在文章上...对于计算技术,越是深入越越数学挂钩,想达到大神级别,嗯,我是有自知之明的。计算机技术虽然之多,并不需要我们每一个领域每一项技术都特别的精通。当然,...
  • //进行子表达式计算 if(flag==0){ printf("被除数为零"); return 0; } s1[++top1]=result;//计算结果存入栈顶 return 1; } //计算表达式的函数 float getResult(char exp[]){ int i=0;//用于指向...
  • 基于二叉树的表达式计算C语言

    千次阅读 2017-09-17 21:54:31
    基于二叉树的表达式计算C语言 deran pan, blg-012 1、方法  支持的运算符包括+、-、×、/、(、)、^、sin、cos、tan。不支持括号的嵌套。  计算过程的一个例子如下: 2. 源码如下  expreesion_...
  • C语言实现表达式计算

    2010-04-21 10:40:30
    本段程序为以课程的作业(数据结构),有两段程序(中缀转后缀计算表达式,直接计算两种),完全用turbo c编写,兼容性良好(不存在turbo c上能运行,在vc上报错的现象)!当时做的时候费了很多脑经,现在分享出来,...
  • 前缀表达式C语言

    千次阅读 2019-09-08 22:14:06
    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。 输入格式为:“运算符 对象 1 对象 2”,其中,运算符为“+”(加法)、“-”(减 法)、“*”(乘法) 或“/”(除法),运算对象为不...
  • 表达式的值是栈的经典操作,我只简单地实现了正数的四则运算,包括括号运算,也可计算小数,没有检查表达式是否输入正确,以后再改进。实现过程中借鉴了其它博主的一些算法,如有侵权,我会立即删除。 #include &...
  • 摘要:来实验室已经...在思考过程中发现,这个计算器的难点就是如何把中缀表达式转换为后缀表达式,以及如何计算后缀表达式计算思路人的思路如果只是用于解题的话,这种方法是最快最准确的。但是它不适用于计算...
  • 数据结构程序(C语言):输入一个算术表达式,由常量、变量、运算符和括号组成(规定:操作数只能为正整数,而操作符只能是+、-、×、/这几个二元运算符,用“#”表示表达式结束),输出对算术表达式计算的结果。...
  • 用两种方式实现表达式自动计算 一设计思想 计算算术表达式可以用两种方法实现 1.中缀转后缀算法 此算法分两步实现 先将算术表达式转换为后缀表达式 然后对后缀表达式进行计算具体实现方法如下 1中缀转后缀 需要建一...
  • 按照中序表达式与后序表达式的规则借助堆栈进行表示即可(后附详细链接二叉运算树)) 中序表达式就是我们在数学中见到的中规中矩的表达式,例如3+2-(2*3-7);后序表达式满足运算符号置于数字的后面; 在转化的过程...
  • C语言实现计算器 ---- 后缀表达式

    千次阅读 多人点赞 2018-08-17 19:02:52
    对于平时我们书写的算术表达式是 12 * ( 3 + 4 ) - 6 + 8 / 2 这种习惯的写法是中缀表达式 但是计算机一般运行方式是后缀表达式,从左向右依次执行 12 3 4 + * 6 - 8 2 / + 这就是后缀表达式 这个是如何...
  • 结构清晰地介绍了用栈计算表达式的方法,附带详细的注释,希望像能对 和我一样入门级的朋友们有所帮助
  • 输入常规表达式后,自动转换成中缀表达式,并计算结果。C语言实现,原创代码,欢迎下载。
  • 何为语句与表达式C语言中的语句与表达式有什么不同?答案:1信息版本:手机版解决时间 2019-10-03 17:32已解决2019-10-03 03:57何为语句与表达式C语言中的语句与表达式有什么不同?最佳答案2019-10-03 05:26表达式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 108,476
精华内容 43,390
关键字:

表达式计算c语言

c语言 订阅