重学数据结构:栈的应用-逆波兰表达式(C语言)

简单的逆波兰式 c语言 参考博客http://blog.youkuaiyun.com/linraise/article/details/20459751 对于将一个式子转换为逆波兰式。 首先要明确的是,输入为一个字符串,需要一个栈作为辅助空间,输出为一个字符串。 1.首先,从左向右扫描字符串,对于每一个字符 2.若为数字 直接输出到输出字符串 3.while(当扫描到的为操作符时){ 首先确定栈是否为空或栈顶操作符优先级比操作符低 就将操作符压栈,退出循环 或者 出栈至输出字符串 } 4.返回第一步 5.循 阅读详情

表达式求值

波兰表示法(Polish notation,或波兰记法),是一种逻辑、算术和代数表示方法,其特点是操作符置于操作数的前面,因此也称做前缀表示法。如果操作符的元数(arity)是固定的,则语法上不需要括号仍然能被无歧义地解析。波兰记法是波兰数学家扬·武卡谢维奇1920年代引入的,用于简化命题逻辑。

“ 扬·武卡谢维奇本人提到:我在1924年突然有了一个无需括号的表达方法,我在文章第一次使用了这种表示法。 ”
—— Łukasiewicz(1), p. 610, footnote.
阿隆佐·邱奇在他的经典著作《数理逻辑》中提出该表达方法是一种值得被关注的记法系统,甚至将它与阿弗烈·诺夫·怀海德和伯特兰·罗素在《数学原理》中的逻辑表达式相提并论。

波兰表达式也叫后缀表达式

栈的定义及其基本操作

#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 10
#define bool int
#define true 1
#define false 0;
typedef struct
{
    int top;
    int *data;
}SqStack;

typedef struct
{
    int top;
    char *data;
}SqStack_Oper;


bool IsEmpty(SqStack S)
{
     if(S.top==-1)
         return true;
    else
        return false;
}
bool IsFull(SqStack S)
{
     if(S.top==MaxSize-1)
         return true;
    else
        return false;
}


int GetTopElem(SqStack S)
{
    if(IsEmpty(S))
        return -1;
    else
        return S.data[S.top];

}
bool PushStack(SqStack *S,int e)
{
    if(IsFull(*S))return false;
    S->top++;
    S->data[S->top]=e;
    return true;
}


bool PopStack(SqStack *S,int *e)
{
    if(IsEmpty(*S))return false;
    *e=S->data[S->top];
    S->top--;
    return true;
}

bool IndexOf(char str[],char x)
{
    long len=strlen(str);
    for(int i=0;i<len;i++)
    {
        if(str[i]==x)
            return true;
    }
   return false;
}
//主要用于计算括号的个数
int IndexOf_Blacket(char str[],char x)
{
	int j=0;
    long len=strlen(str);
    for(int i=0;i<len;i++)
    {
        if(str[i]==x)
            j++;
    }
   return j;
}

void InitStack(SqStack *S)
{
   S->top=-1;
   S->data=(int*)malloc(sizeof(int));
   for(int i=0;i<MaxSize-1;i++)
   {
      S->data[i]=-1;
   }
}
bool IsEmpty_Oper(SqStack_Oper S)
{
     if(S.top==-1)
         return true;
    else
        return false;
}
bool IsFull_Oper(SqStack_Oper S)
{
     if(S.top==MaxSize-1)
         return true;
    else
        return false;
}


char GetTopElem_Oper(SqStack_Oper S)
{
    if(IsEmpty_Oper(S))
        return NULL;
    else
        return S.data[S.top];

}
bool PushStack_Oper(SqStack_Oper *S,char e)
{
    if(IsFull_Oper(*S))return false;
    S->top++;
    S->data[S->top]=e;
    return true;
}


bool PopStack_Oper(SqStack_Oper *S,char *e)
{
    if(IsEmpty_Oper(*S))return false;
    *e=S->data[S->top];
    S->top--;
    return true;
}



void InitStack_Oper(SqStack_Oper *S)
{
   S->top=-1;
   S->data=(char*)malloc(sizeof(char));
   for(int i=0;i<MaxSize-1;i++)
   {
      S->data[i]=' ';
   }
}
int OperationCaculate(int left,int right,char opera)
{
   int result=-1;
   switch(opera)
   {
     case '+':result=left+right;break;
     case '-':result=left-right;break;
     case '*':result=left*right;break;
     case '/':result=left/right;break;
   }
   return result;
}


bool CompareOpera(char og,char des)
{
	if(des==NULL||og==NULL){
		return false;
	}
   else if(IndexOf("+,-",des)&&IndexOf("+,-,*,/",og))
	   return true;
   else  if(IndexOf("+,-,*,/",des)&&IndexOf("*,/",og))
	   return true;
   else 
	   return false;
}

后缀表达式求值

int SuffixExpressionCaculate(char origin[])
{
	int originlen=strlen(origin);
	if(originlen<=0) return NULL;
    int result;
	SqStack S;
	InitStack(&S);
     

    for(int i=0;i<originlen;i++)
	{
		if(IndexOf("+,-,*,/",origin[i]))
		{
			int left_opera,right_opera;
			if(PopStack(&S,&right_opera)&&PopStack(&S,&left_opera))
			{
                int result= OperationCaculate(left_opera,right_opera,origin[i]);
				//printf("%d%c%d=%d\n",left_opera,origin[i],right_opera,result);
				PushStack(&S,result);
			}else
				return NULL;
		}
		else
		{
			int og=origin[i]-'0';
		    PushStack(&S,og);
		}
	}
    if(!IsEmpty(S))
		result=GetTopElem(S);

	return result;
}
中缀转换为后缀表达式
char* OrignalExpToSuffixExp(char origin[])
{
	int originlen=strlen(origin);
	if(originlen<=0) return NULL;
	int blacket_count=IndexOf_Blacket(origin,'(');//获取括号个数
    char *result=(char *)malloc(sizeof(char));
    int j=0;
	SqStack_Oper S;
	InitStack_Oper(&S);

    for(int i=0;i<originlen;i++)
	{
		if(blacket_count>0&&IndexOf("(,)",origin[i]))
		{
		   	if(origin[i]=='(')
			{
				PushStack_Oper(&S,origin[i]);
				continue;
			}
			if(origin[i]==')')
			{
				blacket_count--;
				int top=S.top;
				char top_opera;
				char des=GetTopElem_Oper(S);
				while(des!='(')
				{
					 if(PopStack_Oper(&S,&top_opera))
						   result[j++] =top_opera;
					 des=GetTopElem_Oper(S);
				}
				PopStack_Oper(&S,&top_opera);//把(退出栈
			}
		}
		else if(IndexOf("+,-,*,/",origin[i]))
		{
		
			if(blacket_count==0)
			{
				int top=S.top;
				bool flag=false;
				while(!flag)
				{
					
				    char des=GetTopElem_Oper(S);
					if(S.top!=-1&&CompareOpera(des,origin[i]))
					{
						char top_opera;
						if(PopStack_Oper(&S,&top_opera))
						     result[j++] =top_opera;
					}
					else
					{
					   flag=true;
					}
				}
				PushStack_Oper(&S,origin[i]);//把当前符号压栈
			}
			else
			{
			   PushStack_Oper(&S,origin[i]);
			}

		}
		else
		{
		    result[j++]=origin[i];
		}		
	}
    while(!IsEmpty_Oper(S))//把剩余栈中的符号输出
	   {
			char top_opera;
			if(PopStack_Oper(&S,&top_opera))
			 result[j++] =top_opera;
	   }
	return result;
}
测试代码
int main(int argc, char* argv[])
{
   //测试后缀表达式计算
   char suffix_expr[]="5311+-/3*211++-";
   int result=SuffixExpressionCaculate(suffix_expr);
   printf("测试后缀表达式计算:");
   printf("SuffixExpressionCaculate(%s)=%d\n",suffix_expr,result);

	//测试中缀表达式转换成后缀表达式
   char origin_expr[]="((5/(3-(1+1)))*3)-(2+(1+1))";
   char *result_ots=OrignalExpToSuffixExp(origin_expr);
    printf("测试中缀表达式转换成后缀表达式:");
   printf("OrignalExpToSuffixExp(%s)=%s\n",origin_expr,result_ots);

	//测试中缀表达式转换成后缀表达式并计算
   int result_otsc =SuffixExpressionCaculate(result_ots);
     printf("测试中缀表达式转换成后缀表达式并计算:");
   printf("SuffixExpressionCaculate(%s)=%d\n",origin_expr,result_otsc);
  
   return 0;
}

测试结果
测试后缀表达式计算:SuffixExpressionCaculate(5311+-/3*211++-)=11
测试中缀表达式转换成后缀表达式:OrignalExpToSuffixExp(((5/(3-(1+1)))*3)-(2+(1+1)))=5311+-/3*211++-
测试中缀表达式转换成后缀表达式并计算:SuffixExpressionCaculate(((5/(3-(1+1)))*3)-(2+(1+1)))=11
栈运用 逆波兰表达式 C语言 逆波兰表达式即后缀表达式 输入逆波兰表达式输出结果 大致思路: 输入字符,注意字符与字符之间间隔,故创建缓存数组 将字符转化为浮点数后压入栈,因逆波兰表达式会将优先级表现出来,则将浮点数遇见符号进行计算即可,计算结果再压入栈等待与后面的浮点数再遇见输入的符号 #include <stdio.h> #include <stdlib.h> #include <ctype.... 阅读详情

相关推荐

【数据结构】逆波兰表达式

栈 数据结构 C++ 逆波兰表达式

liuxiaoqian_的专栏 770

数据结构-C语言版-栈(逆波兰)

小甲鱼的逆波兰程序,我也看不懂,并且在VS上面有bug,以后学完一遍再回来看看 //实现对逆波兰输入的表达式的计算 //支持带小数点的数据 // a+(b-c)------>>>a b c - + //a+(b-d)*d------>>-> a b c - d * + #include<stdio.h> #include<stdlib.h> #include<math.h> #include <ctype.h> #.

weixin_45404725的博客 217

逆波兰表达式 c语言实现

使用c语言实现,将给定的运算表达式翻译成逆波兰表达式的形式

逆波兰表达式[栈 C 语言 实现]

逆波兰表达式[栈 C 语言 实现] 逆波兰表达式 逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。 ...

WBA 852

C语言逆波兰式(数据结构)

C语言逆波兰式(数据结构),用vc写的,可以试试

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 366

波兰表示法和逆波兰表示法

一、简介 波兰表示法(Polish notation,或波兰记法),是一种逻辑、算术和代数表示方法,其特点是操作符置于操作数的前面,因此也称做前缀表示法。如果操作符的元数(arity)是固定的,则语法上不需要括号仍然能被无歧义地解析。波兰记法是波兰数学家扬·武卡谢维奇1920年代引入的,用于简化命题逻辑。 扬·武卡谢维奇本人提到: “ 我在1924年突然有了一个无需括号的表达...

weixin_30525825的博客 544

LangChain实战:用FAISS搭建本地文档问答系统(含Word文件处理避坑指南)

本文详细介绍了如何利用LangChain框架和FAISS向量数据库构建本地化智能文档问答系统,特别针对Word文档处理中的技术难点提供实用解决方案。通过模块化设计、本地化支持和多格式兼容,实现高效文档处理与精准问答,满足企业对数据隐私和安全的需求。

o4p5q6r7s的博客 409

C的回归基础学习——数据结构(1)栈

C的回归基础学习——数据结构(1) 前言 我好像忘了去补前面的内容了。。。。 这次终于来到数据结构部分。数据结构很重要,上手也只需要背点模板(有时甚至可以直接套用函数库),但是要深入研究数据结构的变形与应用真的费脑子,之前学这一模块只注意前者(所以我现在很菜),这次重学数据结构重点一定要放在后面啊。 那么,言归正传,回到这次的主题——栈 栈的实现 一句话说明栈的作用:先进后出(LIFO-last ...

C_H_Arthur的博客 263

如何给K8S配置一个具有永久有效的kubeconfig

在 Amazon EKS 环境中,Kubernetes 的认证机制与 AWS IAM 深度集成,通过aws-iam-authenticator动态生成临时凭证。这种设计虽然增强了安全性,但给需要持久化凭证的工具链(如 CI/CD 系统中的 KubeVela)带来了挑战。具体表现为:临时凭证失效​​:默认 Token 有效期为 15 分钟至 1 小时;​​IAM 角色限制​​:直接使用aws eks get-token生成的凭证无法持久化

小杨同学的博客 660

单片机设计具备断电记忆功能的计时器

本文介绍了如何设计一款具备断电记忆功能的计时器,利用单片机和EEPROM存储器实现了计时器值的保存和恢复。当然,在实际的设计中还需要考虑其他因素,如电源管理、时钟精度等,以确保计时器的正常运行和准确性。选择合适的单片机:在设计计时器时,我们需要选择一款具备存储功能的单片机,以便在断电后能够保存计时器的状态。可以优化显示方式,使用更加直观的界面来展示计时器的值;函数中,我们首先从 EEPROM 中读取计时器的初始值,然后在一个无限循环中每秒钟增加计时器的值,并将新的值写入 EEPROM 中。

RlDart的博客 1094

【Chertanis】【1】语言重设计,语法例子,有BNF,第16次设计(水文)_synthesis

前言 编译器我是一定要做的。 将编译器作为兴趣的契机在复习一个C++数据结构学习时,做的是个中缀表达式转后缀表达式,然后用栈对后缀表达式进行求解。应该很多人都会和我有同样的想法,能不能用这种逆波兰表达式来制作编程语言呢?毕竟逆波兰表达式可以用来计算表达式,甚至更进一步可以引入数学函数功能 , 刚开始的suatin解释器项目,我就启动了两次。第三次制作的是zhangqi编译器,在操作符优先级上,使用了递归,但是还是无法理解如何将BNF语法实现为对应的代码。第四次制作的是i think of you编译

痛苦的时候装出幸福相,这不是那么难做到的事 557

SAP 与 Palantir 合作全景解析:这不是普通集成,而是把 ERP、数据语义层、云迁移与企业级 AI 串成一条价值链

SAP与Palantir的战略合作聚焦企业数字化转型核心痛点,通过深度技术整合构建"数据-决策-执行"闭环。合作包含四大主线:云迁移连续性保障、SAP业务数据云与Palantir平台对接、联合工程开发、高监管行业优先落地。技术实现上采用SAP认证插件,支持双向数据交互和实时业务动作触发。该合作突破了传统ERP系统局限,将业务语义与AI执行相结合,特别适合制造业供应链优化、财务争议处理等高价值场景,为企业在云迁移过程中实现业务连续性与智能化升级提供新范式。

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

7-9 逆波兰表达式求值(20 分)

#include&lt;iostream&gt; #include&lt;stack&gt; #include&lt;cstdio&gt; #include&lt;stdlib.h&gt; using namespace std; int main(){ stack&lt;int&gt;s; char str[100]; int a,b; while(~scanf("%s",str)){ ...

酱菜小可爱的博客 6220

【一 扣子客户案例合集】【 1.3 识典古籍基于扣子智能助手的古籍数字化全流程技术解析】

古籍数字化智能处理系统全流程解析 本文详细介绍了基于扣子智能助手的古籍数字化解决方案,核心技术包括: 多层级架构设计:采用"云-边-端"三层次架构,整合高精度扫描设备与AI处理模块,实现从物理古籍到结构化数据的全流程自动化。 智能图像处理:通过12道预处理工序(包括畸变校正、污渍去除和对比度增强)处理古籍图像,采用改进的EAST算法和ViT模型实现高精度文字检测与识别,准确率达98.7%。 NLP增强处理:结合Transformer-XL预训练模型和N-gram语言模型进行文本校正,基于

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1441

YOLOv8-Pose NCNN Android部署优化实践

本文探讨了在Android设备上高效部署YOLOv8-Pose姿态检测模型的优化实践。通过修改Pose头部导出逻辑,分离后处理到C++端实现,并替换SiLU激活函数为ReLU,显著提升了计算效率。具体步骤包括模型结构优化、ONNX导出、NCNN转换与算子融合,最终在Android端实现了30FPS的稳定推理性能。项目提供了完整的优化思路和实现方案,对移动端AI应用开发具有参考价值。

FJN110的博客 323

C语言实现逆波兰表达式

#include #include #include #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int stack

yiluohan0307的专栏 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言数据结构之逆波兰表达式求值

逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。eg:1+1逆波兰表达式:1 1 +eg:1+(2-1)*3逆波兰表达式:1 2 1 - 3 * +实现截图:Stack.h#ifndef _...

bool的博客 4720

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

逆波兰表达式求值(C语言实现)

实验项目: 从文本文件输入任意一个语法正确的(中缀)表达式,显示并保存该表达式。 利用栈结构,把上述(中缀)表达式转换成后缀表达式,并显示栈的状态变化过程和所得到的后缀表达式。 利用栈结构,对上述后缀表达式进行求值,并显示栈的状态变化过程和最终结果。 备注:读文件的输入为(以'#'起始和结尾): #10+13*10+5%2+2^3+(5+6)*7# #include &lt;stdio...

George的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构学习之栈-逆波兰表达式(一)

其实逆波兰表达式不难,更是栈的一个经典问题。网上关于逆波兰表达式的blog也很多。本人也曾经受到这些好blog的帮助。只不过,别人做过的事,毕竟不是自己做过的。因此,为了一步一步脚踏实地。我也写一篇blog来讲讲逆波兰表达式核心思路。 逆波兰表达式主要是两个部分:1、中缀转后缀。2、后缀表达式求值 中缀表达式,后缀表达式这些名词可能对于菜鸟程序员来说,是个新鲜的词语。中缀表达式就是我们生活中经常写的

long0506的博客 382

重学数据结构:三对角矩阵公式推导过程

文章目录三对角矩阵概念公式推导过程(下标为1的情况) 三对角矩阵概念 公式推导过程(下标为1的情况) k=2i+j-3推导过程: 当i=1时,只有两个元素。当i=2~i-1时,每一行都有三个元素。在最后的i行,有j-i+1个元素。 *k= 2+(i-1-2+1)3 + (j-i+1)= 2i+j-3 i=(k+1)/3+1,j=k-2i+3推导过程: i j k 1 1 0 1 2 1 2 1 2 2 2 3 2 3 4 3 2 5 3 3 6 3 4

啃梨的博客 1万+

重学数据结构:串的基本操作(C语言)

串的结构 赋值操作 StrAssign(&T,chars):赋值操作。把串T赋值为chars。 赋值操作 StrCopy(&T,S):复制操作。由串S复制得到串T。 StrEmpty(S):判空操作。若S为空串,则返回TRUE,否则返回FALSE。 StrLength(S):求串长。返回串S的元素个数。 ClearString(&S):清空操作。将S清为空串。 DestroyString(&S):销毁串。将串S销毁(回收存储空间)。 Concat(&T,S1,S2):

啃梨的博客 5288

重学数据结构:树的层序遍历(C语言)

文章目录树的层序遍历层序遍历代码测试代码测试结果其他用到的代码 树的层序遍历 顾名思义,就是一层一层的输出内容。要实现这个功能,需要用到我们之前学到的队列的相关操作。以二叉树为例,,根节点先输出,遍历所有节点,把当前节点的左右子节点也加入队列,若当前列队不为空,则输出队头节点,并获取对头节点的左右子节点加入队列,直到队列为空。 层序遍历代码 //层序遍历 bool LevelOrder(BiTree tree) { if(tree==NULL) return false; LinkQueue *

啃梨的博客 642

重学数据结构:树的定义、性质

文章目录树的定义树的性质节点数=度数+1度为m的树和m叉树的关系度为m的树第i层最多有mi-1个节点高度为h的m叉树最多的节点有(等差数列求和=m0+m1+m2+......+mh)高度为h的m叉树至少有h个节点高度为h且度为m的树至少有 树的定义 树的性质 节点数=度数+1 度为m的树和m叉树的关系 度为m的树 m叉树 定义 树的所有节点 相同点 不同点1 不同点2 度为m的树第i层最多有mi-1个节点 高度为h的m叉树最多的节点有(等差

啃梨的博客 627
上一篇: 重学数据结构:栈的应用-括号匹配(C语言)
下一篇: 重学数据结构:串的基本操作(C语言)
Ken_Li_Lsq
博客等级 码龄14年 22粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值