使用栈实现多项式加减法运算

277 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

这是大二上学期数据结构这门课的一份平时作业,老师要求使用链表来实现多项式的加减法计算
多项式加法:对比两个多项式的指数,指数相同的系数相加。

多项式减法:对比两个多项式的指数,指数相同的系数相减

建立操作数栈和运算符栈。运算符有优先级。规则: 自左至右扫描表达式,凡是遇到操作数一律进操作数栈。 当遇到运算符时,如果它的优先级比运算符栈栈顶元素的优先级高就进栈。 反之,取出栈顶运算符和操作数栈栈顶的连续两个操作数进行运算,并将结果存入操作数栈, 然后继续比较该运算符与栈顶运算符的优先级。 左括号一律进运算符栈,右括号一律不进运算符栈,取出运算符栈顶运算符和操作数栈顶的两个操作数进行运算, 并将结果压入操作数栈,直到取出左括号为止。

相关部分有注释帮助大家进行查看,又不会的地方大家可以私信或是评论区给我留言


** 代码如下 **

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<math.h>

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status;

typedef struct polynmial
{
	float coef; //系数
	int exp; //指数

	struct polynmial *next; //指针
} Node, *LinkList;

Status Initpolyn(Node *L) //初始化链表
{
	L = (LinkList)malloc(sizeof(Node));
	if (!L)              //若空间申请失败则返回0退出
		return ERROR;
	L->next = NULL;  //指针初始化
	return OK;
}

Status Createpolyn(Node *L) //设置多项式
{
	int num, i;
	LinkList p;

	printf("请输入一元多项式的个数:\n");
	scanf("%d", &num);

	printf("请输入一元多项式的系数和指数(例:2*x^3输入为2,3):\n");

	p = L;

	for (i=0; i<num; ++i) //输入一项则申请一个空间进行储存
	{
		p->next = (LinkList)malloc(sizeof(Node));
		p = p->next;
		scanf("%f,%d", &p->coef, &p->exp);
	}
	p->next = NULL; //尾项指针赋值为空
	return TRUE;
}

void Display(Node *L) //输出多项式内容
{
	LinkList p;
	p = L->next;

	printf("该多项式为:\n");

	while (p != NULL) //若该项地址不为空,则遍历输出该多项式的内容
	{
		printf("%.2f x^%d  | ", p->coef, p->exp);
		p = p->next;
	}
}

void Addpolyn(Node *La, Node *Lb, Node *Lc, int n) //对多项式进行加减操作
{
	float sum;
	LinkList pa, pb, pc;
	pc = (LinkList)malloc(sizeof(Node)); //对实表进行初始化
	pc->next = NULL;

	pc = Lc; //利用一个实参储存新表的首结点

	pa = La->next;
	pb = Lb->next;

	while (pa && pb) //若两个表不为空,则循环对比
	{
		if (pa->exp == pb->exp) //若两项相等,则判断加或减运算,再对系数进行运算
		{
			if (n == 1)
			{
				sum = pa->coef + pb->coef;
			}
			else if (n == 0)
			{
				sum = pa->coef - pb->coef;
			}
			if (sum) //若系数不为0,则把运算后的系数和表A的指数存入新表中作为一项
			{
				pc->next = (LinkList)malloc(sizeof(Node));
				pc = pc->next;
				pc->coef = sum;
				pc->exp = pa->exp;
			}
			pa = pa->next;
			pb = pb->next;
		}
		else   //若两项不相等,则将系数小的一项存入新表中,然后遍历到下一项,循环判断直到一个表结束
		{
			pc->next = (LinkList)malloc(sizeof(Node));
			pc = pc->next;
			if (pa->exp < pb->exp)
			{
				pc->coef = pa->coef;
				pc->exp = pa->exp;
				pa = pa->next;
			}
			else if (pa->exp > pb->exp)
			{
				pc->coef = pb->coef;
				pc->exp = pb->exp;
				pb = pb->next;
			}
		}
	}
	
	while (pa) //若表A未结束,则将剩下的项均存入新表中
	{
		pc->next = (LinkList)malloc(sizeof(Node));
		pc = pc->next;
		pc->coef = pa->coef;
		pc->exp = pa->exp;
		pa = pa->next;
	}

	while (pb) //若表B未结束,则将剩下的项均存入新表中
	{
		pc->next = (LinkList)malloc(sizeof(Node));
		pc = pc->next;
		pc->coef = pb->coef;
		pc->exp = pb->exp;
		pb = pb->next;
	}

	pc->next = NULL;
}

double GetRe(Node *Lc) //计算多项式的值
{
	LinkList p = NULL;
	int name;
	double x, sum_poly = 0;
	
	scanf("%lf", &x); 
		p = Lc->next;

	while (p) //若该表地址非空,则遍历每一项进行运算
	{
		sum_poly += (double)p->coef * (double)(pow(x,p->exp));
		p = p->next;
	}

	return sum_poly;
}

int main()
{
	Node La, Lb, Lc;
	int change;
	double result;

	Initpolyn(&La); //创建表A,B
	Initpolyn(&Lb);

	Createpolyn(&La); //创建多项式A,B
	Display(&La);

	Createpolyn(&Lb);
	Display(&Lb);

	printf("若输入1则对多项式进行加操作,输入0则对多项式进行减操作:");
	scanf("%d", &change);

	Addpolyn(&La, &Lb, &Lc, change);
	Display(&Lc);

	printf("请输入x的值:\n");

	result = GetRe(&Lc);
	printf("%.2lf\n", result);

	return 0;
}