c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值

GEE去云处理代码段解读(位运算) GEE去云处理代码段解读,包含位运算符号解读、bitwiseAnd()函数、eq()函数解读 阅读详情

 

//c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值

/*
这个算法难的不是思想,而是尽可能的解决输入格式的问题
这个程序还有两个问题没有解决可以实现输出负数,但是不能输入负数,一旦输入时括号不匹配会发生错误。
主要思想:
利用两个栈,一个存放字符运算符,一个来存放整数.
其中涉及整数的转换和表达式的格式检测及算符之间的优先级.
本算法还很不工整优化.
*/

//-----头文件------

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

//-----宏定义------

#define INIT_STACKSIZE 100
#define INCREMENTSIZE 10
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//-----替换和结构体-----

typedef int Bool;
typedef struct
{
	char *Base,*Top;
	int stacksize;
}SqStackC,*StackC;
typedef struct
{
	int *Base,*Top;
	int stacksize;
}SqStackI,*StackI;

//-------函数列表-------

Bool InitStackC(StackC s);
Bool PopC(StackC s,char *e);
Bool PushC(StackC s,char e);
Bool StackEmptyC(StackC s);
Bool ClearStackC(StackC s);
char GetTopC(StackC s);

Bool InitStackI(StackI s);
Bool PopI(StackI s,int *e);
Bool PushI(StackI s,int e);
Bool StackEmptyI(StackI s);
Bool ClearStackI(StackI s);
int GetTopI(StackI s);

Bool InN(char ch);
void Expression();
Bool Rule(char ch);
char Precede(char c1,char c2);
int Operate(int a,char theta,int b);

//------主函数------

void main()
{
	Expression();
}

//-----其余函数------

void Expression()
{
	SqStackC sq1,*OPTR=&sq1;
	SqStackI sq2,*OPND=&sq2;
	int integer=0,ei,i,flag,startflag,flag1,flag2,flag3,a,b;
	char ec,ch,theta;
	do
	{   flag3=0;
	flag=1;
	flag1=0;
	flag2=0;
	startflag=0;
	InitStackC(OPTR);InitStackI(OPND);
	PushC(OPTR,'#');
	ch=getchar();
	while('#'!=ch||'#'!=GetTopC(OPTR))
	{

		if(!Rule(ch)||(0==startflag&&('+'==ch||'*'==ch||'/'==ch||'-'==ch))||flag1>=2)
		{
			flag=0;
		}
		if(InN(ch))
		{
			flag1=0;
			if(0==integer&&'0'==ch)
			{
				flag=0;
			}
			integer=integer*10+ch-'0';
		}
		else if(('+'==ch||'-'==ch||'*'==ch||'/'==ch||'#'==ch||')'==ch)&&(0==flag2)&&(0!=integer&&'0'!=ch))
		{
			flag1++;
			PushI(OPND,integer);
			integer=0;
		}
		if(Rule(ch)&&(!InN(ch)))
		{
			switch(Precede(GetTopC(OPTR),ch))
			{
			case '<':PushC(OPTR,ch);ch=getchar();flag2=0;break;
			case '=':PopC(OPTR,&ec);ch=getchar();flag2=0;break;
			case '>':PopI(OPND,&b);PopI(OPND,&a);PopC(OPTR,&theta);PushI(OPND,Operate(a,theta,b));flag2=1;break;
			case '@':flag=0;break;
			}
		}
		else
		{
			ch=getchar();
			flag2=0;
		}
		startflag=1;
		flag3++;
		if(flag3>30)
		{
			flag=0;
		}
	}
	if(0==flag)
	{
		printf("表达式格式错误!重新输入.\n");
		getchar();
		ClearStackC(OPTR);
		ClearStackI(OPND);
	}
	}while(0==flag);
	while(!StackEmptyI(OPND))
	{
		PopI(OPND,&ei);
		printf("%d ",ei);
	}
	getchar();
	getchar();
}

Bool InitStackC(StackC s)
{
	if(!(s->Base=(char*)malloc(INIT_STACKSIZE*sizeof(char))))
	{
		exit(OVERFLOW);
	}
	s->Top=s->Base;
	s->stacksize=INIT_STACKSIZE;
	return TRUE;
}

Bool PopC(StackC s,char *e)
{
	if(s->Base==s->Top)
	{
		return ERROR;
	}
	*e=*(--s->Top);
	return TRUE;
}

Bool PushC(StackC s,char e)
{
	if(s->Top-s->Base>=s->stacksize)
	{
		if(!(s->Base=(char*)realloc(s->Base,(INIT_STACKSIZE+INCREMENTSIZE)*sizeof(char))))
		{
			exit(OVERFLOW);
		}
		s->Top=s->Base+s->stacksize;
		s->stacksize+=INIT_STACKSIZE;
	}
	*(s->Top++)=e;
	return TRUE;
}

Bool StackEmptyC(StackC s)
{
	return s->Base==s->Top?TRUE:ERROR;
}

Bool ClearStackC(StackC s)
{
	free(s->Base);
	s->Base=NULL;
	s->Top=NULL;
	return TRUE;
}

char GetTopC(StackC s)
{
	if(!s->stacksize||s->Base==s->Top)
	{
		return ERROR;
	}
	return *(s->Top-1);
}

Bool InitStackI(StackI s)
{
	if(!(s->Base=(int*)malloc(INIT_STACKSIZE*sizeof(int))))
	{
		exit(OVERFLOW);
	}
	s->Top=s->Base;
	s->stacksize=INIT_STACKSIZE;
	return TRUE;
}

Bool PopI(StackI s,int *e)
{
	if(s->Base==s->Top)
	{
		return ERROR;
	}
	*e=*(--s->Top);
	return TRUE;
}

Bool PushI(StackI s,int e)
{
	if(s->Top-s->Base>=s->stacksize)
	{
		if(!(s->Base=(int*)realloc(s->Base,(INIT_STACKSIZE+INCREMENTSIZE)*sizeof(int))))
		{
			exit(OVERFLOW);
		}
		s->Top=s->Base+s->stacksize;
		s->stacksize+=INIT_STACKSIZE;
	}
	*(s->Top++)=e;
	return TRUE;
}

Bool StackEmptyI(StackI s)
{
	return s->Base==s->Top?TRUE:ERROR;
}

Bool ClearStackI(StackI s)
{
	free(s->Base);
	s->Top=s->Base=NULL;
	return TRUE;
}

int GetTopI(StackI s)
{
	if(!s->stacksize||s->Base==s->Top)
	{
		return ERROR;
	}
	return *(s->Top-1);
}

Bool InN(char ch)
{
	return ch>='0'&&ch<='9'?TRUE:ERROR;
}

Bool Rule(char ch)
{
	if(ch>='0'&&ch<='9')
	{
		return TRUE;
	}
	else if('#'==ch||'('==ch||')'==ch||'+'==ch||'-'==ch||'*'==ch||'/'==ch)
	{
		return TRUE;
	}
	return ERROR;
}

char Precede(char c2,char c1)
{
	char opera[8][8]={
		{'@','+','-','*','/','(',')','#'},
		{'+','>','>','<','<','<','>','>'},
		{'-','>','>','<','<','<','>','>'},
		{'*','>','>','>','>','<','>','>'},
		{'/','>','>','>','>','<','>','>'},
		{'(','<','<','<','<','<','=','@'},
		{')','>','>','>','>','@','>','>'},
		{'#','<','<','<','<','<','@','='}};
	int i,j,mark_i=0,mark_j=0;
	for(i=0;i<8;i++)
	{
		if(opera[0][i]==c2)
		{
			mark_i=i;
		}
	}
	for(j=0;j<8;j++)
	{
		if(opera[j][0]==c1)
		{
			mark_j=j;
		}
	}
	return opera[mark_i][mark_j];
}

int Operate(int a,char theta,int b)
{
	int res=0;
	switch(theta)
	{
	    case '+':res=a+b;break;
		case '-':res=a-b;break;
		case '*':res=a*b;break;
		case '/':res=a/b;break;
	}
	return res;
}


 

【即插即用模块】Transformer篇 | TCSVT 2025 | DAFM:双注意力聚合+反向跨模态筛选,特征精准捕捉并融合! 本文提出了一种双模态注意力融合模块(DAFM),用于增强多模态图像融合任务中的特征交互。该模块通过双注意力聚合机制,结合自注意力与跨模态注意力,有效提升特征融合效果。DAFM采用可学习平衡因子动态调整注意力权重,并运用深度卷积降低计算复杂度。实验结果表明,该模块能显著提升多模态图像融合质量,适用于RGB-红外等双模态视觉任务。模块代码实现简洁,可直接集成到现有网络中作为特征融合层使用。 阅读详情

相关推荐

RK3588工业开发板实战:如何用IgH EtherCAT主站精准控制伺服电机(附完整代码)

本文详细介绍了如何利用RK3588工业开发板和IgH EtherCAT主站实现伺服电机的精准控制。从硬件选型、实时内核配置到EtherCAT主站安装和核心代码实现,提供了一套完整的工业自动化解决方案,特别适合需要高精度运动控制的场景。

pca5navigator的博客 972

C语言数据结构算法——简单表达式求值(支持计算小数及负数)

文章目录样例输入输出中缀表达式转后缀表达式后缀表达式求值运行示例 样例输入输出 输入为一段简单表达式(中缀),表达式中的数据可以是小数以及整数,负数前后都有括号分隔,以下是一段输入样例: 4.5*(3.8-0.9*2)+2.5*(9.6/(-2.4)) 输出为计算结果即 -1。 中缀表达式转后缀表达式 代码如下,算法思路在注释里了,改进了算法加入了对小数以及负数的支持: /* 以下为中缀表达式转后缀表达式: while (从exp读取字符ch,ch!='\0') { ch为数字:

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 5683

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

表达式求值,栈的应用(C语言)

无语死了,好在终于弄出来了。 题目:利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。要求输出表达式的值(两运算符号的有限关系见教材《数据结构》表3.1)。 测试样式: 【第一组自测数据】 【键盘输入】 3*(9-7)#↙ 【正确输出】 6 【第二组自测数据】 【键盘输入】 (0-

永远的第一天 3958

汉字跨越三千年的生命力与数字时代适应性

文字作为文明载体,其演变规律始终遵循实用性与适应性的平衡。汉字作为现存最古老的文字系统,凭借形义结合的六书构造原理,实现了超方言的文化统一功能。在计算机处理方面,五笔输入法与Unicode支持证明了其技术兼容性,而视觉识别效率的先天优势使其在信息时代更具传播效力。从甲骨文识别AI到现代书法设计,汉字系统持续展现强大的文化承载力与技术适应性,这种活态传承为数字人文研究提供了独特样本。

weixin_29058331的博客 355

Infiniband互连网络概述

一、Infiniband是什么? InfiniBand(简称IB)是一种工业标准规范,它定义了一种输入/输出架构,用于计算节点、通信基础设施设备、存储和嵌入式系统的互连。操作系统可以是Linux、Windows或ESXI。 IB网络一共是五层,从第一天起,IB就被设计为提供一个端到端的解决方案,改善和加速从物理层到上层的所有协议层。 IB协议于2000年由IBTA(InfiniBand Trade Association)提出,其规定了一...

weixin_41687819的博客 5230

C语言网 题目 1683: 数据结构-表达式求值

C语言顺序表实现表达式求值,我很笨,这一题写了半天,理了好久的思路,目前想到的就是使用大量的条件判断语句来实现(┬┬﹏┬┬)(┬┬﹏┬┬)(┬┬﹏┬┬)题目描述算数四则运算的规则是1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。由此,算式4+2*3-10/5的计算顺序为4+2*3-10/5=4+6-10/5=4+6-2=8。给定一个以“#”作为结束符的算式,求出算式的结果。给出严蔚敏《数据结构(C语言)》中的一段算法描述以作参考:图1:表达式求值算法图2:表达式求值算法(续)

qq_62109928的博客 893

基于Python的农业市场价格抓取与供需分析:现代爬虫技术与实战应用

在正式开始爬虫开发之前,我们首先了解爬虫的基本概念和工作原理。爬虫(Web Scraping)是通过编程的方式,自动从互联网上获取信息的技术。它可以帮助我们提取HTML页面中的特定数据,通常用于收集并处理大量信息。发送HTTP请求:爬虫需要向目标网站发送请求,获取网站的HTML页面内容。解析HTML页面:通过HTML解析器对获取的页面内容进行解析,提取其中需要的数据。数据清洗与存储:将提取的数据进行清洗,去除多余的字符或无关内容,然后存储到合适的格式(如CSV文件、数据库等)中。数据分析与可视化。

2201_76125261的博客 1118

数据结构——栈的应用(表达式求值)(C语言)

char Precede(char t1, char t2)函数用于输出t1,t2两个运算符的优先级(t1为先出现的运算符(已经压入栈OPTR中),t2为后出现的运算符)char Precede(char t1, char t2){ int i,j; char pre[][7]={ //运算符之间的优先级制作成一张表格 {'>

Sup_klz的博客 2万+

【Altium Designer】Off grid pin解决方法

​今天我画完原理图编译时,出现了太多的黄色(出现warning警告提示)Off grid pin警告,这个警告并不是原理图电气连接出问题了,而是元器件或器件PIN脚没有和栅格对齐造成的原因。再编译还是出现这个警告。 最后经过不断翻阅网上经验和实践,才最终解决,本经验详细记录了解决该警告的有效方法。 解决方案:以下是问题解决步骤... ​

夜半少年的博客 7550

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

算法与数据结构实验题-利用堆栈实现四则运算(包含小数运算与负数运算)

前言- 哈喽大家好,我是大鹏,目前是大二的一名学生,今天提供给大家算法与数据结构的一道实验题,有不足之处还请各位大佬指正,好了,废话不多说,咱们直接看代码。 #include<bits/stdc++.h> using namespace std; #define MaxSize 100 typedef float ElemType; typedef struct stack{ ElemType *ch; int top; }SqStack;//定义栈 SqStack OPN

qq_53283658的博客 1194

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c语言数据结构迷宫算法,c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>...

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫//题目:栈解迷宫//---------头文件---------#include#include//---------宏定义---------#define TRUE 1#define ERROR 0#define OVERFLOW -2//------替换和结构体-------typedef int Status;typedef str...

weixin_42357916的博客 265

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测

//c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测 /* 初始化栈 初始化标志位 循环标志位不为1 { 输入一个字符并判断是否为括号 如果是<[{(则进栈 如果是>]})则出栈 { 判断出栈的字符和输入的字符是否相等 { 相等则继续 否则标志位为0 } } 判断栈空否 { 栈空则标志位

runner2012的专栏 1473

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>

//c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫 //题目:栈解迷宫 //---------头文件--------- #include #include //---------宏定义--------- #define TRUE 1 #define ERROR 0 #define OVERFLOW -2 //------替换和结构体------- typedef int Stat

runner2012的专栏 1705

aub的c语言线性代码,c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB

//c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB//题目:假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A∪B//思想:/*主函数:初始化集合A和集合B给A和B集合输入元素当集合B中的元素不到最后一个元素时{取出B中的元素和A中的元素比较if(A没有B有){插入A的集合里面}}输出合并后的集合*//*void main(){List *A=InitL();L...

weixin_39950083的博客 475

数据结构多项式乘法c语言,c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘...

//c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘/*主要函数思想:初始化一元多项式A初始化一元多项式B初始化一元多项式C给一元多项式A赋入数据给一元多项式B赋入数据(指数升序)把AB各项累乘放入C中用双指针的模式消除合并累加最后得到结果输出*///---------头文件----------#include#include//---------宏定义----------#...

weixin_35466750的博客 206

c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘

//c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘 /* 主要函数思想: 初始化一元多项式A 初始化一元多项式B 初始化一元多项式C 给一元多项式A赋入数据 给一元多项式B赋入数据(指数升序) 把AB各项累乘放入C中 用双指针的模式消除合并累加最后得到结果 输出 */ //---------头文件---------- #include #include //-------

runner2012的专栏 3443

c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表

//c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表 //题目:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La与Lb一起为一个新的线性表Lc(值非递减排列) /* 主要函数思想: 初始化La,Lb,Lc链表头; 输入La,Lb链表数据; 当La链表下一个结点不为空或者Lb链表下一个结点不为空 { 比较La和Lb的结点 { La的结点>=L

runner2012的专栏 2257

c语言队列模拟排队编程,c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)...

//c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)//------头文件---------#include#include#include//-------宏定义---------#define TURE 1#define ERROR 0#define OVERFLOW -2//------替换及结构体------typedef int Bool;typedef st...

weixin_35826751的博客 759

c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>

//c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换 /* 初始化栈 输入要转换的进制并进行判断是否在制定进制内 输入要转换的整数并判断改整数是否大于零 循环当整数不为零的时候 { 先对该整数求余(选择的进制) 余数进栈 在对该整数求除(选择的进制) } 循环当栈不为空 { 出栈 } */ //---------头文件---------- #include #

runner2012的专栏 2105

c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB

//c语言版数据结构(奇迹冬瓜)-链表实战(1)A=AUB //题目:假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=A∪B //思想: /* 主函数: 初始化集合A和集合B 给A和B集合输入元素 当集合B中的元素不到最后一个元素时 { 取出B中的元素 和A中的元素比较 if(A没有B有) { 插入A的集合里面 } } 输出合

runner2012的专栏 2079

c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)

//c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队) //------头文件--------- #include #include #include //-------宏定义--------- #define TURE 1 #define ERROR 0 #define OVERFLOW -2 //------替换及结构体------ typedef int Boo

runner2012的专栏 4856

c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加

//c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加 /* 主要函数思想: 初始化一元多项式A 初始化一元多项式B 初始化一元多项式C 给一元多项式A赋入数据 给一元多项式B赋入数据(指数升序) 当A的结点或者B的结点项的下一项不为空 { 比较AB的指数 { 定位当前结点A的指数,定位当前结点B的指数. 如果A的结点指数<B的结点指数(C的下一个结

runner2012的专栏 2303

c语言版数据结构(奇迹冬瓜)-单链式队列

(一)      队列(FIFO)先进先出模式,包含初,毁,清,空,长,得,进,出。八种基本操作。现以两种存储方式为例,来讲解队列的用法。    (二)      单 链式存储结构  //----头文件----- #include #include //-----宏定义----- #define TURE 1 #define ERROR 0 #define OVERFLOW -2

runner2012的专栏 2037

c语言版数据结构(奇迹冬瓜)-串的匹配模式算法

[一]传统匹配模式 //-----头文件------ #include #include //------宏定义------ #define MAXSTRLEN 255 #define OVERFLOW -2 #define TURE 1 #define ERROR 0 //-------类型名替换-------- typedef unsigned char SString[MAXSTRLE

runner2012的专栏 3064
上一篇: c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测
下一篇: c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)
utral董东东
博客等级 码龄16年 158粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值