栈实现简单多项式运算

思路

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

链式实现文件

头文件

#ifndef _STACK_H_
#define _STACK_H_




typedef enum{FALSE,TRUE} BOOL;


typedef int Data;

typedef struct _node
{
	Data data;            //节点数据
	struct _node *next ; //
}Node;


typedef struct _stack
{
	
	Node *top;
	
}Stack;


//初始化空栈
void Init_Stack(Stack*s);


//入栈
void Push(Stack*s,Data data);

//判断空栈
BOOL IsEmpty(Stack*s);

//出栈
void Pop(Stack*s);


//获取栈顶元素
Data Gettop(Stack*s);


//打印栈数据
void Display_Stack(Stack*s);


#endif//_STATCK_H_

C文件

#include "stack.h"
#include <stdlib.h>
#include <stdio.h>


void Init_Stack(Stack*s)
{
	if(NULL == s)
		return ;
	
	s->top = NULL;
}


void Push(Stack*s,Data data)
{
	if(NULL == s)
		return ;
	
	Node *new_node =(Node*)malloc(sizeof(Node)/sizeof(char));
	if(NULL == new_node)
	{
		return ;
	}
	
	new_node->data = data;
	
	new_node->next = s->top;
	s->top= new_node;
		
}


BOOL IsEmpty(Stack*s)
{
	if(NULL == s)
		return ;
	
	
	if(NULL == s->top)
		return TRUE;
	
	return FALSE;
}

void Pop(Stack*s)
{
	if(NULL == s)
		return ;
	
	if(IsEmpty(s) == TRUE)
		return ;
	
	
	Node *tmp    = s->top;
	s->top       = tmp->next;
	
	free(tmp);

}


Data Gettop(Stack*s)
{
	if(NULL == s)
		return ;
	
	if(IsEmpty(s) == TRUE)
	{
		printf("栈空\n");
		exit(-1) ;
	}
	
	
	return s->top->data;
}


void Display_Stack(Stack*s)
{
	
	while(!IsEmpty(s))
	{
		
		printf("%d\n",Gettop(s));
		
		Pop(s);	
	}
	printf("栈打印结束并置空栈!!!!");
}

计算器实现文件

头文件

#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_


/************** 函数名:IsPush **********************			
函数功能:
			判断操作符是否入栈	
函数参数:	
			[in] s_opes : 操作符栈
			[in] p      : 需要判断的操作符
函数返回值:
			TRUE  : 入栈
		    FALSE : 不入栈
*************** 函数名:IsPush *********************/
BOOL IsPush(Stack *s_opes,char*p);

/************** 函数名:calcu  **********************			
函数功能:
			在操作数栈取出两个操作数 ,
			在操作符栈取出一个操作符 ,
			进行计算。
函数参数:	
			[in] s_opes : 操作符栈
			[in] s_nums : 操作数栈
函数返回值:

*************** 函数名:calcu *********************/
void calcu(Stack *s_opes,Stack *s_nums);

/************** 函数名:deal_ope **********************			
函数功能:
			操作符处理。
			如果不能入栈进行计算,一直计算操作符栈为空。
			如果能入栈,则入栈。	
函数参数:	
			[in] s_opes : 操作符栈
			[in] s_nums : 操作数栈
			[in] p      : 需要入栈的操作符
函数返回值:
			
*************** 函数名:deal_ope *********************/
void  deal_ope(Stack *s_nums,Stack *s_opes,char*p);

/************** 函数名:Calculator **********************			
函数功能:
			计算加减乘除含括号的多项式运算
函数参数:	
			[in]exp     : 需要计算的合法表达式
函数返回值:
			返回类型    :int
			返回值		:计算的结果
*************** 函数名:Calculator*********************/
int Calculator(char*exp);

#endif//_CALCULATOR_H_

C文件

#include "stdio.h"
#include "stack.h"
#include "calculator.h"


// 判断操作符是否入栈
BOOL IsPush(Stack *s_opes,char*p)
{
		
	if(IsEmpty(s_opes))
		return TRUE;
	
	int top_data = Gettop(s_opes);
	
	switch (top_data)
	{
		case '+':
		case '-':
			if(*p == '*' || *p == '/' || *p == '(')
				return TRUE;
			else
				return FALSE;
			break;
		case '*':
		case '/':
			if( *p == '(')
				return TRUE;
			else
				return FALSE;
			break;	
		case '(':	
			if( *p == ')')	
			{
				Pop(s_opes);				
				return TRUE;
			}
			break;
		default :
			break;
	}
}


// 计算
void calcu(Stack *s_opes,Stack *s_nums)
{
	
	if(s_opes == NULL || s_nums == NULL)
		return;
	
	if(IsEmpty(s_opes))
		return ;
	
	int res;
	
	int num1 = Gettop(s_nums);
	Pop(s_nums);
	int num2 = Gettop(s_nums);
	Pop(s_nums);
	
	int ope  = Gettop(s_opes);
	switch (ope)
	{
		case '+':
			res = num2 + num1;
			break;
		case '-':
			res = num2 - num1;
			break;
		case '*':
			res = num2 * num1;
			break;
		case '/':
			res = num2 / num1;
			break;			
		default:
			break;
	}
	Push(s_nums,res);
	Pop(s_opes);
}



//操作符处理
void  deal_ope(Stack *s_nums,Stack *s_opes,char*p)
{

	// 操作符不入栈计算
	while(IsPush(s_opes,p) == FALSE)
	{	
		calcu(s_opes,s_nums);	
	}
	// 操作符入栈
	if(IsPush(s_opes,p) == TRUE)
	{
		if( *p == ')')	
			return ;
		
		Push(s_opes,*p);
	}

}


int Calculator(char*exp)
{
	Stack s_nums; //操作数栈
	Stack s_opes; //操作符栈
	
	Init_Stack(&s_nums);
	Init_Stack(&s_opes);

	char *p = exp;
	
	//入栈
	while(*p)
	{
		// 操作数入栈
		if(*p >= '0' && *p <= '9')
		{
			int num = 0;
			while( *p >= '0' && *p <= '9')
			{
									
				num = num*10 + (*p -'0');
				p++;
			}
			Push(&s_nums,num);
		}
		else  // 操作符入栈
		{		
			OpesPush(&s_nums,&s_opes,p);
			p++;				
		}	
			
	}	
	

	calcu(&s_opes,&s_nums); //计算最终的值    
	
	int res = Gettop(&s_nums);
	
	//剩余元素出栈
	Pop(&s_nums);

	return res;
	
}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值