【C语言】【数据结构】栈的应用(进制转换、括号匹配检验、行编辑程序、表达式求值)_实现顺序栈的基本操作,进行数制转换和括号匹配的检测;-程序员宅基地

技术标签: C    数据结构  

栈的应用——进制转换、括号匹配检验、行编辑程序、表达式求值
顺序栈的基本操作

进制转换:对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数。

int main()
{
    
	SqStack S;
	int x, e;
	
	printf("输入一个非负的十进制整数:\n");
	if(InitStack(S) != 1) printf("Creatd Error!\n");
	scanf("%d", &x);
	while(x)
	{
    
		Push(S, x%8);
		x = x/8;
	}
	while(S.base != S.top)
	{
    
		Pop(S,e);
		printf("%d", e);
	}
}

括号匹配检验:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即()或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式。输入一个包含上述括号的表达式,检验括号是否配对。

void check()
{
     // 对于输入的任意一个字符串,检验括号是否配对
	SqStack s;
	SElemType ch[80],*p,e;
	if(InitStack(s)) // 初始化栈成功
	{
    
		printf("请输入表达式\n");
		gets(ch);
		p=ch;
		while(*p) // 没到串尾
		switch(*p)
		{
    
			case '(':
			case '[':	Push(s, *p); p++;
						break; // 左括号入栈,且p++
			case ')':
			case ']':	if(!StackEmpty(s)) // 栈不空
						{
    
							Pop(s, e); // 弹出栈顶元素
							if(*p==')'&&e!='('|| *p==']'&&e!='[') 	
									// 弹出的栈顶元素与*p不配对
							{
    
								printf("isn't matched pairs\n");
								exit(ERROR);
							}
							else
							{
    
								p++;
								break; // 跳出switch语句
							}
						}
						else // 栈空
						{
    
							printf("lack of left parenthesis\n");
							exit(ERROR);
						}
			default:	p++; // 其它字符不处理,指针向后移
		}
		if(StackEmpty(s)) // 字符串结束时栈空
			printf("matching\n");
		else
			printf("lack of right parenthesis\n");
	}
}

行编辑程序:接受用户从终端输入的程序或数据,在输入过程中,允许用户输入出差错,并在发现有误时可以及时更正。例如:当用户发现刚刚键入的一个字符是错的时,可以补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。

void LineEdit()
{
    
	SqStack s;
	char ch,c;
	int n,i;
	InitStack(s);
	scanf("%d",&n);
	ch=getchar();		//把回车get了 
	for(i=1;i<=n;i++)
	{
    
		ch=getchar();
		while(ch!='\n')
		{
    
			switch(ch)
			{
    
				case '#':	Pop(s,c);
							break; 			// 仅当栈非空时退栈
				case '@':	ClearStack(s);
							break; 			// 重置s为空栈
				default :	Push(s,ch); 	// 有效字符进栈
			}
			ch = getchar();		 // 从终端接收下一个字符
		}
		StackTraverse(s,visit); 	// 将从栈底到栈顶的栈内字符输出
		ClearStack(s); 			// 重置s为空栈
	}
	DestroyStack(s);
}

表达式求值:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。要求输出表达式的值。

unsigned char op[7] = {
    '+', '-', '*', '/', '(', ')', '='};
unsigned char opcmp[7][7] = {
    '>', '>', '<', '<', '<', '>', '>',
 							'>', '>', '<', '<', '<', '>', '>',
 							'>', '>', '>', '>', '<', '>', '>',
 							'>', '>', '>', '>', '<', '>', '>',
 							'<', '<', '<', '<', '<', '=', ' ',
 							'>', '>', '>', '>', ' ', '>', '>',
 							'<', '<', '<', '<', '<', ' ', '='};

SqStack OPTR, OPND;		//OPTR寄存运算符,OPND寄存操作数或运算结果

Status In(char c, unsigned char op[])	//检验是否为运算符
{
    
	int i;
	for(i=0; i<7; i++)
	{
    
		if(c==op[i]) return OK;
	}
	return ERROR;
}

char Precede(char c1, char c2)		//比较两个相邻运算符的优先关系
{
    
	int i,j;
	for(i=0; i<7; i++)
		if(c1 == op[i]) break;
	for(j=0; j<7; j++)
		if(c2 == op[j]) break;
	return opcmp[i][j];
}

void Operate(char a1, char theta1, char b1)		//计算
{
    
	int i;
	char outcome;
	for(i=0; i<4; i++)
		if(theta1 == op[i]) break;
	switch(i)
	{
    
		case 0: outcome = a1 + b1 - '0'; break;
		case 1: outcome = a1 - b1 + '0'; break;
		case 2: outcome = (a1-'0') * (b1-'0') + '0'; break;
		case 3: outcome = (a1-'0') / (b1-'0') + '0'; break;
	}
	Push(OPND, outcome);
}

int main()
{
    
	char c, e, x, theta;
	char a, b;
	
	if(!InitStack(OPTR) || !InitStack(OPND)) printf("Created Error!\n");
	Push(OPTR, '=');
	c = getchar();
	while(c!='=' || GetTop(OPTR, e)!='=')
	{
    
		if(!In(c, op))
		{
    
			Push(OPND, c);
			c = getchar();
		}
		else
		{
    
			switch(Precede(GetTop(OPTR, e) , c))
			{
    
				case'<': Push(OPTR, c); c = getchar(); break;
				case'=': Pop(OPTR, x); c = getchar(); break;
				case'>': Pop(OPTR, theta); 
						Pop(OPND, b); Pop(OPND, a); 
						Operate(a, theta, b); break;
			}
		}
	}
	printf("%c", GetTop(OPND, e));
} 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47135547/article/details/107957327

智能推荐

【Pandas数据处理100例】(十八):Pandas的shift数据位移操作_pandas 列为指定条件位移-程序员宅基地

文章浏览阅读273次。大家好,我是阿光。本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。正在更新中~ 我的项目环境:该函数可以经过偏移后的数据测试数据如下:shift函数的默认偏移量是1,就是会将数据向下偏移一位,第一个位置缺失由于没有上一个元素,所以为空。如果我们要向上移动元素,只需要将periods设置为负值,大小就是偏移量。我们在偏移过程中,靠近上方或者下方的数据会出现空值,所以我们可以使用fill_value这个参数_pandas 列为指定条件位移

前端常见的十种布局_前端布局的几种方式-程序员宅基地

文章浏览阅读1.9k次。前端布局常见的有很多种,不同的应用场景有不同的布局方式,下面就来简单介绍一下吧。静态布局、浮动布局、定位布局、栅格布局、table布局、弹性(flex)布局、圣杯布局自适应布局、流式布局、响应式布局_前端布局的几种方式

kotlin面试题android最新面试题及答案-程序员宅基地

文章浏览阅读916次,点赞21次,收藏22次。作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!GitHub地址[外链图片转存中…(img-zC3l0rPJ-1710283715230)]

计算机网络(王道考研)笔记个人整理——第四章-程序员宅基地

文章浏览阅读977次,点赞6次,收藏15次。3.组播(多播):当网络中的某些用户需要特定数据时,组播数据发送者仅发送一次数据,借助组播路由协议为组播数据包建立组播分发树,被传递的数据到达距离用户端尽可能近的节点后才开始复制和分发,是一点对多点的传输方式。转发表由路由表得来,可以用软件实现,也可以用特殊硬件实现,转发表必须包含完成转发功能所必须的信息,在转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC地址信息的映射。对地址为x的相邻路由器发来的RIP报文,修改此报文中的所有项目,把”下一跳“字段中的地址改为x,并把所有”距离“字段+1。

UVa 445 Marvelous Mazes(非凡的迷宫)_marvelous mazes uva中文-程序员宅基地

文章浏览阅读946次。Marvelous Mazes Your mission, if you decide to accept it, is to create a maze drawing program. A maze will consist of the alphabetic characters A-Z, * (asterisk), and spaces.Input an_marvelous mazes uva中文

MyBatis插入Insert、InsertSelective的不同以及使用心得_mybatis insertselective-程序员宅基地

文章浏览阅读7.9k次。逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分别为insert和insertSelective。这两个方法均是插入对象的方法。为什么会有两个插入方法呢?这里说一下两者的区别。_mybatis insertselective

随便推点

【学习随笔】图灵-计算机器与人工智能_can machines think-程序员宅基地

文章浏览阅读1k次。思维导图模仿游戏 作者首先提出了"Can machines think?" (“机器可以思考吗?”)这个问题。相比与尝试定义“机器”“思考”,作者提出了“模仿游戏”。 一个男人(A),一个女人(B)和一个可以是任意性别的询问者(C),A模仿B来误导C的判断,C通过询问AB判断具体两人性别。 从而提出"What will happen when a machine takes the part of A in this game?"(“当让一个机器..._can machines think

【kubernetes系列】Kubernetes之configMap_configmap挂载配置文件-程序员宅基地

文章浏览阅读1.4k次。工作中,在几乎所有的应用开发中,都会涉及到配置文件的变更,比如服务需要配置MySQL、Redis等相关信息。而业务上线一般要经历开发环境、测试环境、预发布环境只到最终的线上环境,每一个环境一般都需要其独立的配置。如果我们不能很好的管理这些配置文件,运维工作将顿时变的无比的繁琐而且很容易出错。工作中最佳实践是将应用所需的配置信息于程序进行分离,这样可以使得应用程序被更好的复用,如将应用打包为容器镜像后,可以通过环境变量或外挂文件的方式在创建容器时进行配置注入。_configmap挂载配置文件

uniapp 系统广播、自定义广播插件 Ba-Broadcast_声音提示、震动提示、语音播报 ba-beep-程序员宅基地

文章浏览阅读2.4k次。Ba-Broadcast 是一款可监听系统广播的uniapp插件,如息屏、亮屏、声音、电量等等。支持监听系统广播;支持自定义广播;支持发送广播。_声音提示、震动提示、语音播报 ba-beep

什么是解耦-程序员宅基地

文章浏览阅读3.9k次。解耦(Decoupling)是指通过降低代码之间的依赖性,减少模块或组件之间的耦合程度。在软件开发中,解耦是一种良好的设计原则,它可以提高代码的可维护性、可测试性和可扩展性。当两个模块或组件之间高度耦合时,它们的改动往往会相互影响,一个模块的修改可能会导致其他模块的变动,这增加了系统的复杂性和风险。_解耦

2022年自学Java最新学习路线(建议观看)_java学习路线-程序员宅基地

文章浏览阅读3.5k次,点赞7次,收藏29次。给大家总结了一下2022年Java最新的学习路线图,跟着这个技术栈学习Java,全部内容都熟练掌握,至少可以找到一份15K的工作。在学习过程中困难会非常多,需要用很有技巧的学习方法和耐心。一部分:入门基础二部分:Java高级技术三部分:前端技术四部分:Javaweb五部分:企业主流框架六部分:项目阶段七部分:企业专题相信今年学习Java的都是从零基础开始的,所以一定切记学习Java要系统学习,严格的跟着教程大纲走_java学习路线

Javamail发送邮件后并保存邮件到已发送_代码发送的邮件 邮件服务器有已发送的邮件吗-程序员宅基地

文章浏览阅读1.1w次。前言最近北京暴雨,不知道为什么,特喜欢下雨天,下雨天适合睡觉,同样也适合写作!需求分析最近有个需求是将发送的邮件保存到已发送,一般来说最简单的做法是在服务器上配置,但是产品说,很多用户不知道这个选项,最好技术来实现,好吧,既然这样说了,干就完了!查看JavaMail Api文档邮件是在邮件服务器上存储的,邮件服务器上建立了各种的文件夹,比如INB_代码发送的邮件 邮件服务器有已发送的邮件吗