C语言笔记39 •数据结构--栈队列-OJ•

news2024/12/25 9:18:51

栈&队列-OJ

1.给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

(1).左括号必须用相同类型的右括号闭合。

(2).左括号必须以正确的顺序闭合。

(3).每个右括号都有一个对应的相同类型的左括号。

//1.栈和队列OJ题:括号匹配问题

#define _CRT_SECURE_NO_WARNINGS 1

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


typedef char STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

void StackInit(ST* ps);
void StackDestory(ST* ps);

void StackPush(ST* ps, STDataType x);// 入栈
void StackPop(ST* ps);// 出栈

STDataType StackTop(ST* ps);

int StackSize(ST* ps);
bool StackEmpty(ST* ps);

void StackInit(ST* ps)
{
	assert(ps);

	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	if (ps->a == NULL)
	{
		printf("malloc fail\n");
		exit(-1);
	}

	ps->capacity = 4;
	ps->top = 0;
}

void StackDestory(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}

// 入栈
void StackPush(ST* ps, STDataType x)
{
	assert(ps);

	if (ps->top == ps->capacity)//判断空间是否够用,不够就要增容
	{
		STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		else
		{
			ps->a = tmp;
			ps->capacity *= 2;
		}
	}

	ps->a[ps->top] = x;
	ps->top++;
}

// 出栈
void StackPop(ST* ps)
{
	assert(ps);
	// 栈空了,调用Pop,直接中止程序报错
	assert(ps->top > 0);

	//ps->a[ps->top - 1] = 0;
	ps->top--;
}

STDataType StackTop(ST* ps)
{
	assert(ps);
	// 栈空了,调用Top,直接中止程序报错
	assert(ps->top > 0);

	return ps->a[ps->top - 1];
}

int StackSize(ST* ps)
{
	assert(ps);

	return ps->top;
}

bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

bool isValid(char* s)//判断符号
{
	
	if (*s == ')' || *s == '}' || *s == ']')
	{
		return false;//匹配失败
	}
	//struct Stack st;  //上面对struct Stack进行了重命名(line11) typedef struct Stack ST
	ST st;//创建 栈
	StackInit(&st);
	while (*s != '\0')
	{
		switch (*s)
		{
		case '(':
		case '{':
		case '[':
		{
			StackPush(&st, *s);
			s++;
			break;
		}

		case ')':
		case '}':
		case ']':
		{
			if (StackEmpty(&st))
			{
				StackDestory(&st);
				return false;
			}
			char top = StackTop(&st);
			StackPop(&st);
			if (top != '(' && *s == ')'
				|| top != '{' && *s == '}'
				|| top != '[' && *s == ']')
				{
					StackDestory(&st);
					return false;//匹配失败
				}
			else
				{
					s++;
					break;
				}
		}
		default:
			break;
		}

	}
	bool over = StackEmpty(&st);
	StackDestory(&st);
	return over;
}


bool isValid0(char* s) {
	ST st;
	StackInit(&st);
	while (*s != '\0')
	{
		switch (*s)
		{
		case '{':
		case '[':
		case '(':
		{
			StackPush(&st, *s);
			++s;
			break;
		}
		case '}':
		case ']':
		case ')':
		{
			if (StackEmpty(&st))
			{
				StackDestory(&st);
				return false;
			}

			char top = StackTop(&st);
			StackPop(&st);

			// 不匹配
			if ((*s == '}' && top != '{')
				|| (*s == ']' && top != '[')
				|| (*s == ')' && top != '('))
			{
				StackDestory(&st);
				return false;
			}
			else // 匹配
			{
				++s;
			}
			break;
		}
		default:
			break;
		}
	}

	bool ret = StackEmpty(&st);
	StackDestory(&st);
	return ret;
}
int main()
{
	printf("%d\n", isValid("))"));
	printf("%d\n", isValid("(){}[]"));
	return 0;
}

2.请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
//2.栈和队列OJ题:用队列实现栈

#define _CRT_SECURE_NO_WARNINGS 1

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


typedef int QDataType;
typedef struct QueueNode
{
	QDataType data;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* head;
	QNode* tail;
}Queue;

void QueueInit(Queue* pq)//初始化队列
{
	assert(pq);
	pq->head = pq->tail = NULL;
}

void QueueDestory(Queue* pq)//销毁队列
{
	assert(pq);
	QNode *cur= pq->head;
	while (cur)
	{
		QNode* temp = cur->next;
		free(cur);
		cur = temp;
	}
	pq->head = pq->tail = NULL;
}

void PrintQueue(Queue* pq)//打印队列数据
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}
QNode* Buynode(QDataType x)//申请节点
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;
}

void QueuePush(Queue* pq, QDataType x)//队尾插入数据(队尾进)
{
	assert(pq);
	if (pq->head == NULL)
	{
		pq->head = pq->tail = Buynode(x);
	}
	else
	{
		pq->tail->next = Buynode(x);
		pq->tail = pq->tail->next;
	}
}
void QueuePop(Queue* pq)//队头删除数据(队头出)
{
	assert(pq);
	if (pq->head == pq->tail)
	{
		free(pq->head);
		pq->head = pq->tail=NULL;
	}
	else
	{
		QNode* temp = pq->head->next;
		free(pq->head);
		pq->head = temp;
	}
}
bool QueueEmpty(Queue* pq)//判断队列是否为空
{
	assert(pq);
	return pq->head == NULL;
}
size_t QueueSize(Queue* pq)//队列的长度
{
	assert(pq);
	size_t size = 0;
	QNode* cur = pq->head;
	while (cur)
	{
		size++;
		cur = cur->next;
	}
	return size;
}
QDataType QueueFront(Queue* pq)//输出队头的数据值
{
	assert(pq);
	assert(pq->head);
	return pq->head->data;
}

QDataType QueueBack(Queue* pq)//输出队尾的数据值
{
	assert(pq);
	assert(pq->tail);
	return pq->tail->data;
}
typedef struct
{
	Queue q1;
	Queue q2;
}MyStack;

MyStack* myStackCreate()//创建一个栈
{
	MyStack* ps = (MyStack*)malloc(sizeof(MyStack));
	if (ps == NULL)
	{
		perror("malloc fail\n!");
		exit(-1);
	}
	QueueInit(&ps->q1);
	QueueInit(&ps->q2);
	return ps;
}
void myStackPush(MyStack* obj, QDataType x)//(入栈)
{
	if (!QueueEmpty(&obj->q1))
	{
		QueuePush(&obj->q1, x);
	}
	else
	{
		QueuePush(&obj->q2, x);
	}
}
int myStackPop(MyStack* obj)//删除栈顶数据 (出栈)
{
	//假设obj->q1 指向的队列是空的;obj->q2 指向的队列不是空的;但确定肯定一个是空的,一个非空
	Queue* empty = &obj->q1;
	Queue* noempty = &obj->q2;

	//如果上方假设失败,进行转换,obj->q2 指向的队列是空的;obj->q1 指向的队列是非空的;
	if (!QueueEmpty(&obj->q1))
	{
		empty = &obj->q2;
		noempty = &obj->q1;
	}

	//数据倒换
	while (QueueSize(noempty)>1)
	{
		QDataType head = QueueFront(noempty);
		QueuePush(empty, head);
		QueuePop(noempty);
	}

	//剩下最后一个数据了
	QDataType top = QueueFront(noempty);
	QueuePop(noempty);

	return top;
}
QDataType myStackTop(MyStack* obj)//返回栈顶数据
{
	if (!QueueEmpty(&obj->q1))
	{
		return QueueBack(&obj->q1);
	}
	else
	{
		return QueueBack(&obj->q2);
	}
}

bool  myStackEmpty(MyStack* obj)//判断栈是否为空
{
	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

void myStackFree(MyStack* obj)//栈销毁
{
	QueueDestory(&obj->q1);
	QueueDestory(&obj->q2);
	free(obj);
	obj = NULL;
}


int main()
{
	MyStack* st = myStackCreate();

	myStackPush(st, 1);
	myStackPush(st, 2);
	myStackPush(st, 3);//入栈

	myStackPop(st);//出栈

	printf("%d \n", myStackTop(st));//返回栈顶数据

	myStackFree(st);//销毁栈

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQ消息队列篇:三大MQ产品的必备面试种子题

MQ有什么用&#xff1f; MQ&#xff08;消息队列&#xff09;是一种FIFO&#xff08;先进先出&#xff09;的数据结构&#xff0c;主要用于实现异步通信、削峰平谷和解耦等功能。它通过将生产者生成的消息发送到队列中&#xff0c;然后由消费者进行消费。这样&#xff0c;生产…

【Kubernetes】k8s集群中kubectl的陈述式资源管理

目录 一.k8s集群资源管理方式分类 1.陈述式资源管理方式 2.声明式资源管理方式 二.陈述式资源管理方法 三.kubectl命令 四.项目生命周期 1.创建 kubectl create命令 2.发布 kubectl expose命令 3.更新 kubectl set 4.回滚 kubectl rollout 5.删除 k…

notes for datawhale summer camp chemistry task3

Transformer transformer的诞生 循环神经网络&#xff1a;由于所有的前文信息都蕴含在一个隐向量里面&#xff0c;这会导致随着序列长度的增加&#xff0c;编码在隐藏状态中的序列早期的上下文信息被逐渐遗忘。 卷积神经网络&#xff1a;受限的上下文窗口在建模长文本方面天…

木卫四发布《2024半年度汽车漏洞及威胁情报-简报》

随着智能汽车技术的飞速发展&#xff0c;其安全问题也日益成为行业关注的焦点。木卫四威胁情报中心对2024年上半年国内外智能汽车领域的漏洞情报及安全事件进行了全面研究和分析&#xff0c;发布了《2024半年度汽车漏洞及威胁情报-简报》。本报告中智能汽车威胁情报的来源多样&…

宏集方案 | 传统建筑智能化改造,迈向物联新时代

前言 智能建筑涉及多个系统的集成&#xff0c;如照明、空调、安防等&#xff0c;这些系统的兼容性和协调运作是一大挑战。然而&#xff0c;传统的工业建筑和商业楼宇受早期设计的局限&#xff0c;多个控制系统间互不兼容&#xff0c;并且难以重新部署通信线缆。 针对传统建筑…

Java:查看线程信息

示例用代码 public class Main {static class MyThread extends Thread {Overridepublic void run() {while (true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}public st…

【Canvas与艺术】九角大楼

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>九角大楼</title><style type"text/css">.cen…

“光影魔术手”:一款让照片编辑更高效的软件工具

&#x1f680;&#x1f680;&#x1f680; 摄影爱好者和技术控们&#xff0c;想要照片编辑技能更上一层楼吗&#xff1f;“光影魔术手”带你探索照片美化的高级技巧&#xff0c;这款软件不仅是工具&#xff0c;更是你的技术利器&#xff01; &#x1f308;【专业调色功能解析】…

AS400==使用COBOL写个HELLWORLD

登录后输入命令WRKOBJPDM 可以看到在我的lib下拥有的FILES列表 随便选一个&#xff0c;在OPT输入12回车打开这个FILE&#xff0c;最下面一排提示了&#xff0c;F6创建一个新的MEMBER输入这个FILE FILE相当于文件夹&#xff0c;MEMBER相当于一个代码文件test.py。 移动光标输入…

Leetcode—400. 第 N 位数字【中等】

2024每日刷题&#xff08;151&#xff09; Leetcode—400. 第 N 位数字 算法思想 参考自k神 实现代码 class Solution { public:int findNthDigit(int n) {int digitSize 1;int startNum 1;long long count 9;while(digitSize * count < n) {n - count * digitSize;di…

用Python打造精彩动画与视频,5.1 Matplotlib基础及其动画功能

5.1 Matplotlib基础及其动画功能 在本小节中&#xff0c;我们将介绍Matplotlib的基础知识及其动画功能。Matplotlib是Python中最流行的绘图库之一&#xff0c;它可以生成静态、动态和交互式的图表。通过Matplotlib的动画模块&#xff0c;我们可以创建各种动画效果&#xff0c;…

达梦数据库系列—44.SQL调优

目录 SQL优化思路 1、定位慢sql 2、SQL分析方法 2.1 执行计划 2.2 ET 工具 2.3 dbms_sqltune 工具 3、SQL语句优化 3.1 索引 3.2 SQL语句改写 3.3 表设计优化 3.4 表的连接方式 3.5 HINT 4、统计信息 SQL优化思路 1、定位慢sql 待优化的SQL大致可分为两类&#…

PCIe学习笔记(15)

设备就绪状态 (Device Readiness Status&#xff0c;DRS)消息 &#xff08;Device Readiness Status (DRS) 是PCIe规范中引入的一种机制&#xff0c;旨在改进设备初始化和就绪状态的检测与报告。 在以往的PCIe版本中&#xff0c;系统通常依赖于固定的超时机制来判断设备是否已…

天机学堂 第四天 高并发优化总结

前端每隔15秒就发起一次请求&#xff0c;将播放记录写入数据库。 但问题是&#xff0c;提交播放记录的业务太复杂了&#xff0c;其中涉及到大量的数据库操作&#xff1a; 如何进行优化 单机并发能力 变同步为异步 合并写请求 提高单机并发&#xff1a;优化SQL&#xff0c;尽…

vscode中WSL插件的安装配置

1.安装WSL插件 2.点击左下角的蓝色区域&#xff0c;Connect to WSL连接下载Linux系统&#xff0c;我这里下载Ubuntu ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7ec21d81b4ec49f3856be2d8013bc12f.png 3.输入用户名和密码 4.成功连接 5.配置过程中出现的问题 …

LinuxUNIX系统编程手册——(十四)系统编程概念

14.1 设备专用文件&#xff08;设备文件&#xff09; 设备专用文件与系统的某个设备相对应。在内核中&#xff0c;每种设备类型都有与之相对应的设备驱动程序&#xff0c;用来处理设备的所有 I/O 请求。设备驱动程序属内核代码单元&#xff0c;可执行一系列操作&#xff0c;&a…

服务器SSL证书年费一般多少钱?

SSL证书作为网络安全的重要组成部分&#xff0c;不仅能够保护数据传输的安全性&#xff0c;还能增强用户对网站的信任度。然而&#xff0c;面对市场上众多的SSL证书选项&#xff0c;许多人可能会感到困惑&#xff1a;究竟应该选择哪种类型的SSL证书&#xff1f;它们的价格又是怎…

【从零开始一步步学习VSOA开发】搭建VSOA运行环境

搭建VSOA运行环境 为方便 VSOA 的运行和调测&#xff0c;这里选择RealEvo-Simulator 下的 AMD64 平台作为 VSOA 的硬件运行环境&#xff0c;操作系统则选择标准版的 SylixOS 而不是容器版的SylixOS。 下载虚拟机资源 RealEvo-Simulator 并不自带 AMD64 平台虚拟机&#xff0…

开发板与ubuntu不能ping通怎么办?

TOC 第一步&#xff1a;VMware 设置 打开 VMware Workstation Pro 里的 虚拟机 -> 设置 设置网络适配器为桥接模式。这里不要勾选“复制物理网络连接状态”。 因为电脑是 WiFi 上网&#xff0c;所以需要添加一个网络适配器并设置成 NAT 模式&#xff0c;供虚拟机上网。具…

19066 第K小子串

这个问题可以通过使用集合&#xff08;set&#xff09;和优先队列&#xff08;priority_queue&#xff09;来解决。我们首先遍历字符串的所有子串&#xff0c;然后将这些子串放入一个集合中&#xff0c;这样可以去除重复的子串。然后我们将集合中的子串放入一个优先队列中&…