数据结构 用c语言实现表达式求值

本人水平有限,记录一下日常作业
如果不是来装逼的,欢迎指点
代码的实现,注释比较详细了

中缀表达式求值

输入一个中缀表达式,输出结果



#include<stdio.h>
#include<stdlib.h>
#define Max_Size 400

struct stu {
	int shu[Max_Size];  //创建一个空栈
	int top;
}Shuju;

struct 
{
	char shu[Max_Size];
	int top;
}Fuhao;

 



struct stu3         //创建一个空栈用于比较
{
	char op;
	int pri;
}pan;

//定义运算符优先级
 struct stu3 dy[] = { {'(',1},{'+',2},{'-',2},{'*',3} ,{'/',3},{')',1} };   
 
 
 //比较符号栈内的运算符和即将入栈运算符的优先级
int compare(char pd)    
{
	int i = 0;
	int left = 0;
	int right = 0;

	for (i = 0; i <=5; i++)   
	{
		if (Fuhao.shu[Fuhao.top]== dy[i].op)  //判断栈内的优先级
		{
			 left= dy[i].pri;
			
		}
		if (pd==dy[i].op)    //判断入栈的优先级
		{
			 right = dy[i].pri;
		}
	}
	if (left < right)    //如果栈内小于栈外
	{
		return 0;    // 返回0
	}
	if (left >= right)    //如果栈内大于等于栈外
	{
		return 1;      //返回1
	}
	
}

int zhuan(x)  //定义一个函数用来把字符数转化成整形
{
	x = x - 48;  //字符数减去asicii码值
	return x;  //返回值
}


void jisuan()
{
	int f1 = Fuhao.shu[Fuhao.top ];
	int num1 = Shuju.shu[Shuju.top ]; //弹出数据栈栈顶元素
	int num2 = Shuju.shu[Shuju.top - 1];  //弹出数据站栈顶元素
	Fuhao.top--;
	Shuju.top --;
	if (f1 == '+')  //如果f1为加号
	{
		num2 = num1 + num2;  //进行加运算
		Shuju.shu[Shuju.top] = num2;  //结果放回数据栈顶
		
	}
	if (f1 == '-')   //如果f1为减号
	{
		num2 = num2-num1;  //进行减运算
		Shuju.shu[Shuju.top] = num2;  //结果放回数据栈顶
		
	}
	if (f1 == '*')  //如果f1为乘号
	{
		num2 = num2 * num1;  //进行乘运算
		Shuju.shu[Shuju.top] = num2;  //结果放回数据栈顶
		
	}

	if (f1 == '/')  //如果f1为除号
	{
		num2 = num2 / num1;  //进行除运算
		Shuju.shu[Shuju.top] = num2;  //结果放回数据栈顶
	}
}


int main()
{
	memset(Shuju.shu,0,Max_Size);  //数字栈的初始化
	memset(Shuju.shu,0,Max_Size);//符号栈的初始化
	Shuju.top =-1;        //数字栈的指向符初始化
	Fuhao.top =-1;

	

	char str[Max_Size];    //定义一个字符数组存放表达式
	int top_str = 0;
	
	int a ;   //定义一个变量接受compare返回值

	printf("请输入表达式:\n");
	scanf_s("%s",str,100);   //获取表达式

		while (str[top_str] != '\0')      //判断是否为空位
		{

			if (str[top_str] >= 48 && str[top_str] <= 57)      //判断是否为数字
			{
				Shuju.top++;     //数据数组尾标加一
				Shuju.shu[Shuju.top] = zhuan(str[top_str]);     //把数字压入数据栈
				
				top_str++;      //表达式数组尾标加一

			}
			//是运算符
			else   
			{
				if (Fuhao.top == -1) //判断是否为第一位
				{
					Fuhao.top++; //符号数组尾标加一
					Fuhao.shu[Fuhao.top] = str[top_str];   //第一位直接压入符号栈
					top_str++;
				}
				else if (str[top_str] == '(')   //判断是否为左括号
				{
					Fuhao.top++;  //符号数组尾标加一
					Fuhao.shu[Fuhao.top] = str[top_str];  //左括号直接压入符号栈
					top_str++;
				}

				else if (str[top_str] == ')') //判断是否为右括号
				{
					while (Fuhao.shu[Fuhao.top ] != '(')
					{
						jisuan();

					}

					top_str++;
					Fuhao.top--;   //符号栈栈顶减一


				}
				//如果是运算符
				else if (str[top_str] == '+' || str[top_str] == '-' || str[top_str] == '*' || str[top_str] == '/')
				{
					a = compare(str[top_str]);  //接受返回值

					switch (a)     //分情况讨论
					{
					case 0:    //a为0
					{
						Fuhao.top++;//符号栈尾标加一
						Fuhao.shu[Fuhao.top] = str[top_str];  // 运算符入符号栈
						
						top_str++;
						break;
					}
					case 1:  //a为1
					{
						jisuan();
						
						break;
					}
					}
				}
			}
		}
		
	
		while (Fuhao.top!=-1)  //符号栈内还有运算符执行循环
		{
			jisuan();		//计算
		}
		
	printf("%d",Shuju.shu[Shuju.top]);  //输出结果
	return 0;
}

中缀转后缀求值

输入一个中缀表达式,输出后缀表达式和计算结果



#include<stdio.h>
#include<stdlib.h>
#define Max_size 100

struct      //创建一个栈存放后缀表达式
{
	char shu[Max_size];
	int top;

}shuju;

struct     //创建一个栈存放中转时的符号
{
	char shu[Max_size];
	int top;

}fuhao;

struct stu3         //创建一个空栈用于比较
{
	char op;
	int pri;
}pan;
//定义操作符优先级
struct stu3 dy[] = { {'(',1},{'+',2},{'-',2},{'*',3} ,{'/',3},{')',1} };


int zhuan(x)
{
	x = x - 48;
	return x;

}

int compare(char pd)
{
	int i = 0;
	int left = 0;
	int right = 0;

	for (i = 0; i <= 5; i++)
	{
		if (fuhao.shu[fuhao.top] == dy[i].op)  //判断栈内的优先级
		{
			left = dy[i].pri;

		}
		if (pd == dy[i].op)    //判断入栈的优先级
		{
			right = dy[i].pri;
		}
	}
	if (left < right)    //如果栈内小于栈外
	{
		return 0;    // 返回0
	}
	if (left >= right)    //如果栈内大于等于栈外
	{
		return 1;      //返回1
	}

}




int main()
{
	char cun[Max_size];    //定义一个字符数组存放中缀表达式
	int top_cun;     //定义下标
	memset(shuju.shu,0,Max_size);  //栈的初始化
	memset(fuhao.shu, 0, Max_size);  //栈的初始化
	shuju.top = -1;  //下标初始化
	fuhao.top = -1;  //下标初始化
	top_cun = 0;   //下标初始化
	
	char b=0;  //初始化
	int a;    //接受compare返回值
	printf("input:");  //输入
	printf("\n");  //换行
	scanf_s("%s",cun,60);  //接收表达式
	
		while (cun[top_cun] != '\0')    //判断表达式是否结束
		{
			if (cun[top_cun] >= 48 && cun[top_cun] <= 57)   //判断是否是数字
			{
				shuju.top++;   //栈顶加一
				shuju.shu[shuju.top] = cun[top_cun];   //直接存入数据栈
				
				top_cun++;    //字符数组下标加一
			}
			else 
			{
				if (fuhao.top == -1)    //判断是否是第一个符号
				{
					fuhao.top++;
					fuhao.shu[fuhao.top] = cun[top_cun];  //第一位直接压入符号栈
					
					top_cun++;
				}
				else if(cun[top_cun]=='(')   //判断是否为左括号
				{
					fuhao.top++;   //栈顶加一
					fuhao.shu[fuhao.top] = cun[top_cun];  //左括号直接压入符号栈
					
					top_cun++;  //字符数组下标加一

				}
				//如果是运算符
				else if (cun[top_cun]=='+'||cun[top_cun]=='-'||cun[top_cun]=='*'||cun[top_cun]=='/')
				{
					a = compare(cun[top_cun]);  //接受返回值
					switch (a)     //分情况讨论
					{
					case 0:    //a为0
					{
						fuhao.top++;//符号栈尾标加一
						fuhao.shu[fuhao.top] = cun[top_cun];  // 运算符入符号栈
						
						top_cun++;
						break;
					}
					case 1:  //a为1
					{
						shuju.top++;  //栈顶加一
						//符号栈栈顶放入数据栈
						shuju.shu[shuju.top] = fuhao.shu[fuhao.top];  
						
						fuhao.top--;  //栈顶减一
						break;
					}
					}
				}
				else if(cun[top_cun]==')')    //如果是右括号
				{
					while (fuhao.shu[fuhao.top]!='(')  //不是左括号继续循环
					{
						shuju.top++;  //栈顶加一
						//符号栈栈顶放入数据栈
						shuju.shu[shuju.top] = fuhao.shu[fuhao.top]; 	
						fuhao.top--;  //栈顶减一
					}
					top_cun++;
					fuhao.top--;  //弹出左括号
				}
			}
		}
	
		while (fuhao.top!=-1)   //若符号栈内还有符号
		{
			shuju.top++;   //栈顶加一
			  
			shuju.shu[shuju.top] = fuhao.shu[fuhao.top];//符号栈顶放入数据栈
			fuhao.top--;  //栈顶减一

		}

	printf("后缀表达式为:\n"); 
	printf("%s",shuju.shu);  //输出后缀表达式
	printf("\n");
	

	int jisuan[Max_size];  //定义整形数组存储计算结果
	int  top_ji;   // 定义下标
	top_ji = -1;  //下标初始化
	shuju.top = 0;    //令shuju栈的下标为0
	while (shuju.shu[shuju.top] != '\0')   //判断栈内是否为空
	{
         //如果是数字,减48放入jisuan数组中
		if (shuju.shu[shuju.top] >= 48 && shuju.shu[shuju.top] <= 57)
		{
			top_ji++;  //栈顶加一
			jisuan[top_ji] = shuju.shu[shuju.top] - 48;  //存入jisuan数组中
			shuju.top++;  //栈顶加一
			

		}
		else if (shuju.shu[shuju.top] == '+')   //如果是加号执行加法操作
		{
			int num1 = jisuan[top_ji];  //从jisuan数组中取出数字
			int num2 = jisuan[top_ji-1];  //从jisuan数组中取出数字
			num1 = num1 + num2;  //执行加法
			jisuan[top_ji - 1] = num1;  //计算结果存入数组
			top_ji--;  //栈顶减一
			shuju.top++;  //栈顶加一
		}
		else if (shuju.shu[shuju.top] == '-')  //如果是减号执行加法操作
		{ 
			int num1 = jisuan[top_ji];  //从jisuan数组中取出数字
			int num2 = jisuan[top_ji - 1];  //从jisuan数组中取出数字
			num1 = num2 - num1;  //执行减法
			jisuan[top_ji - 1] = num1;  //计算结果存入数组
			top_ji--; //栈顶减一
			shuju.top++; //栈顶加一


		}
		else if (shuju.shu[shuju.top] == '*')  //如果是乘号执行加法操作
		{
			int num1 = jisuan[top_ji];  //从jisuan数组中取出数字
			int num2 = jisuan[top_ji - 1]; //从jisuan数组中取出数字
			num1 = num2 * num1; //执行乘法
			jisuan[top_ji - 1] = num1; //计算结果存入数组
			top_ji--; //栈顶减一
			shuju.top++;  //栈顶加一
		}
		else if (shuju.shu[shuju.top] == '/')  //如果是乘号执行加法操作
		{
			int num1 = jisuan[top_ji];  //从jisuan数组中取出数字
			int num2 = jisuan[top_ji-1];  //从jisuan数组中取出数字
			num1 = num2 / num1; //执行除法
			jisuan[top_ji-1] = num1; //计算结果存入数组
			top_ji--;  //栈顶减一
			shuju.top++;  //栈顶加一
		}

	}
	printf("%d",jisuan[top_ji]);  //输出结果

	return 0;

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值