webstorm汉化包 Python json wcf vue添加class bootstrap后台管理模板 erp系统源码 小程序demo源码 jq获取元素 mysql操作日志 mysql倒序 oracle分析函数 destoon python库 python关键字 python当前日期 python怎么入门 python自定义异常 java时间戳转换成时间 java数组添加值 java索引 java获得当前日期 磁盘分区软件 幽城幻剑录五内 微信签名一句话至自己 id解锁大师 视频加字幕软件哪个好 c语言表白代码 vbs表白代码 程序员面试宝典 无法打开搜索页 msn格式 js包含字符串 我的世界透视 茸好珠 男网红头像 彻底卸载mysql mix2s拆机 视频字幕制作软件 拍照姿势的摆法女
当前位置: 首页 > 学习教程  > 编程语言

C语言_表达式计算_中缀转后缀_多位数计算

2020/12/28 19:18:31 文章标签:

之前一个好兄弟问我表达式计算的一个程序,这个主要锻炼栈的使用。但是他向我提出了一个问题,如果多位数计算,好像常规的表达式转化就不灵了。即常规的程序只能计算10以下的数字,对于这个问题进行下探索。   举个例子&#xff0c…

  之前一个好兄弟问我表达式计算的一个程序,这个主要锻炼栈的使用。但是他向我提出了一个问题,如果多位数计算,好像常规的表达式转化就不灵了。即常规的程序只能计算10以下的数字,对于这个问题进行下探索。
  举个例子,常规的方法,生成的后缀表达式会是这样的:123-*,这样无法判断是1还是12。也就是对多位数失效。最终确定的思路是在中缀转后缀的过程中,对数字进行判断:如果是多位数,则通过空格隔开。同时在后缀计算中,时刻检查空格的存在,最后完成计算。源代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

#define SIZE 100

//字符栈目的是进行中缀转后缀
char stack[SIZE];
int top = -1;

//整数栈目的是进行后缀表达式的计算
int stack_int[SIZE];
int top_int = -1;

//字符栈操作
void push(char item)
{
	if(top >= SIZE-1)
	{
		printf("\nStack Overflow.");
	}
	else
	{
		top = top+1;
		stack[top] = item;
	}
}

//字符栈操作
char pop()
{
	char item ;

	if(top <0)
	{
		printf("stack under flow: invalid infix expression");
		getchar();
		exit(1);
	}
	else
	{
		item = stack[top];
		top = top-1;
		return(item);
	}
}

//整数栈操作
void push_int(int num)
{
	if(top_int >= SIZE-1)
	{
		printf("\nStack Overflow.");
	}
	else
	{
		top_int = top_int+1;
		stack_int[top_int] = num;
	}
}

//整数栈操作
int pop_int()
{
	int num ;

	if(top_int <0)
	{
		printf("stack under flow: invalid infix expression");
		getchar();
		exit(1);
	}
	else
	{
		num = stack_int[top_int];
		top_int = top_int-1;
		return(num);
	}
}

//funciton:判断是否为操作符
int is_operator(char symbol)
{
	if(symbol == '*' || symbol == '/' || symbol == '+' || symbol == '-')
	{
		return 1;
	}
	else
	{
	return 0;
	}
}

//function:确定优先级
int precedence(char symbol)
{
	if(symbol == '*' || symbol == '/')
	{
		return(2);
	}
	else if(symbol == '+' || symbol == '-')
	{
		return(1);
	}
	else
	{
		return(0);
	}
}

//function:中缀表达式转后缀表达式,结果存于postfix_exp形参中
void InfixToPostfix(char infix_exp[], char postfix_exp[])
{
	int i, j;
	char item;
	char x;

	push('(');
	strcat(infix_exp,")");

	i=0;
	j=0;
	int tag = 0;
	item=infix_exp[i];

	while(item != '\0')
	{
		if(item == '(')
		{
			push(item);
		}
		else if( isdigit(item) || isalpha(item))
		{
			//when meet a digit, judge if the number is bigger than 10
			//if so, add ' ' before it  and ' ' after it
			//use tag as a symbol to add the first ' '
			char next = infix_exp[i+1];
			while (isdigit(next))
			{
				if (tag == 0)
				{
					postfix_exp[j++] = ' '; 
					tag = 1;
					postfix_exp[j++] = item;
					i++;
					item = next;
					next = infix_exp[i+1];
				}
				else
				{
					postfix_exp[j++] = item;
					i++;
					item = next;
					next = infix_exp[i+1];
				}
			}
			//when tag equals to 1, it means a number bigger than 10 appears
			if (tag == 1)
			{
				tag = 0;
				postfix_exp[j++] = item;
				postfix_exp[j++] = ' ';
				item = next;
				i++;
				continue;
			}
			postfix_exp[j] = item;
			j++;
		}
		else if(is_operator(item) == 1)
		{
			x=pop();
			while(is_operator(x) == 1 && precedence(x)>= precedence(item))
			{
				postfix_exp[j] = x;
				j++;
				x = pop();
			}
			push(x);
			push(item);
		}
		else if(item == ')')
		{
			x = pop();
			while(x != '(')
			{
				postfix_exp[j] = x;
				j++;
				x = pop();
			}
		}
		else
		{
			printf("\nInvalid infix Expression.\n");
			getchar();
			exit(1);
		}
		i++;


		item = infix_exp[i];
	}
	if(top>0)
	{
		printf("\nInvalid infix Expression.\n");
		getchar();
		exit(1);
	}
	if(top>0)
	{
		printf("\nInvalid infix Expression.\n");
		getchar();
		exit(1);
	}


	postfix_exp[j] = '\0';
}

//function:后缀表达式计算
long int EvalPostfix(char postfix[])
{
	int i;
	char ch;
	int val; 
	int A, B;
	for ( i = 0; postfix[i] != '\0'; i++)
	{
		ch = postfix[i];
		if(isdigit(ch))
		{
			val = ch-'0';
			push_int(val);
		}
		else if (ch == ' ')
		{
			i++;
			val = 0;
			ch = postfix[i];
			while (ch != ' ')
			{
				val = val*10 + (postfix[i]-'0');
				i++;
				ch = postfix[i];
			}
			push_int(val);
		}
		else if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
		{
			A = pop_int();
			B = pop_int();
		switch(ch)
		{
			case '/':
			val = B / A;
			break;
			
			case '*':
			val = B * A;
			break;
			
			case '+':
			val = B + A;
			break;
			
			case '-':
			val = B - A; 
			break; 
		}
    	push_int(val);
		}
	}

	return pop_int();
}

int main()
{
	char infix[SIZE], postfix[SIZE];
    int value;
	printf("ASSUMPTION: The infix expression contains single letter variables and single digit constants only.\n");
	printf("\nEnter Infix expression : ");
	gets(infix);
	
	InfixToPostfix(infix,postfix);
	printf("Postfix Expression: ");
	puts(postfix);
	
	value = EvalPostfix(postfix);
    printf("Result of expression evaluation : %d", value);
    system("pause");

	return 0;
}

  计算结果如下:
  输入中缀表达式为:10-6*(12-8/4)+3
在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_550199.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?