当前位置: 首页 > news >正文

怎么给一个网站做seo安徽疫情最新情况

怎么给一个网站做seo,安徽疫情最新情况,wordpress 客服代码,怎么做装饰公司网站宣传目录 栈 栈的实现 数组栈 数组栈的实现 栈的初始化 栈的销毁 数据入栈 判断栈是否为空 数据出栈 获取栈顶元素 获取栈内数据个数 项目实现 栈的基础练习 有效的括号 栈 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的…

目录

栈的实现

数组栈

数组栈的实现

栈的初始化

栈的销毁

数据入栈

判断栈是否为空

数据出栈

获取栈顶元素

获取栈内数据个数

项目实现

栈的基础练习

有效的括号


栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

📌

注意在栈中数据出栈的顺序不一定和入栈的顺序相同,当数据入栈后又出栈不影响下一个数据的入栈顺序

例如:

入栈1 2 3 4 5,若4和5是入栈又出栈的,则出栈的顺序应该是4 5 3 2 1

但是不会出现一种情况,即:

已经入栈的数据(未在入栈后立马出栈)不会出现在先入栈又立马出栈的数据的前方

例如:

入栈 1 2 3 4,若3和4是入栈又立马出栈,则不可能出现2和1在3和4的前面

2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()
A 1, 4, 3, 2
B 2, 3, 4, 1
C 3, 1, 4, 2
D 3, 4, 2, 1
例如本题中,入栈顺序为1, 2, 3, 4,那么出栈顺序最基本的就是后入先出,即出栈顺序为4,3,2,1,如果入栈又立马出栈的是2,3,4,则有2,3,4,1,如果入栈又立马出栈的是1,则有1, 4, 3, 2,如果入栈又立马出栈的是3, 4,则有3, 4, 2, 1,但是不可能存在3, 1, 4, 2,因为1作为第一个入栈的,要么就是入栈又立马出栈,作为第一个出栈的,要么就是最后一个出栈的

栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为栈满足后进先出或者即进即出,不需要额外移动数据,并且数组在尾上插入数据的代价比较小。

数组栈

//静态数组栈
typedef int STDataType;
#define N 10
typedef struct Stack
{STDataType _a[N];// 数组大小固定int _top; // 栈顶
}ST;//动态数组栈
typedef int STDataType;
typedef struct Stack
{STDataType* _a;// 数组大小不固定int _top;       // 栈顶int _capacity;  // 容量 
}ST;

数组栈的实现

//主要实现以下功能//栈的初始化
void STInit(ST* st);
//栈的销毁
void STDestroy(ST* st);
//数据入栈
void STPush(ST* st, STDataType x);
//数据出栈
void STPop(ST* st);
//判断栈是否为空
bool STEmpty(ST* st);
//获取栈元素
STDataType STTop(ST* st);
//获取栈数据个数
int STSize(ST* st);

栈的初始化

在初始化过程中注意top的初始值设置为0代表栈内数据的下一个位置,因为初始化栈代表栈内没有元素,如果用0代表栈内数据的当前位置,那么需要考虑该元素从何而来,既然没有数据,说明当前栈顶指针指向没有数据的位置,而数组下标为0代表第一个元素的位置,没有元素就不可能有第一个元素的位置,所以此时下标为0代表下一个元素的位置,此时说明栈内没有元素,但是准备在下一个位置(第一个元素)的位置添加数据

//栈的初始化
void STInit(ST* st)
{//判断是否存在队列assert(st);//初始化队列st->data = NULL;st->top = 0;//栈顶指针指向存储数据的下一个位置,代表栈内无数据//st->top = -1;//栈顶指针指向存储数据的位置,代表栈内无数据st->capacity = 0;
}

栈的销毁

//栈的销毁
void STDestroy(ST* st)
{//确保有栈的存在assert(st);//销毁栈free(st->data);st->data = NULL;//top和capacity更改为无数据的位置st->top = st->capacity = 0;
}

数据入栈

//数据入栈
void STPush(ST* st, STDataType x)
{//确保有栈的存在assert(st);//向top位置增加数据,并使top向后移动//需要判断栈的容量大小if (st->top == st->capacity){//如果栈的空间为0,则开辟四个空间,如果栈容量不为0,则扩容原来容量的2倍int newCapacity = st->capacity == 0 ? 4 : st->capacity * 2;STDataType* tmp = (STDataType*)realloc(st->data, sizeof(STDataType) * newCapacity);assert(tmp);st->data = tmp;//注意更新容量大小st->capacity = newCapacity;}//数据压栈并改变topst->data[st->top++] = x;
}

判断栈是否为空

//判断栈是否为空
bool STEmpty(ST* st)
{//确保有栈的存在assert(st);//栈为空返回真,栈不为空返回假return st->top == 0;//判断表达式返回值只有1和0,如果为真返回1(true),如果为假返回0(false)
}

数据出栈

//数据出栈
void STPop(ST* st)
{//确保有栈的存在assert(st);//确保栈不会越界assert(!STEmpty(st));//直接移动top指针,“看不见即删除”st->top--;
}

获取栈顶元素

//获取栈顶元素
STDataType STTop(ST* st)
{//确保栈存在assert(st);//确保栈不为空assert(!STEmpty(st));//top为栈内数据的下一个位置,要获取当前位置的元素需要-1操作return st->data[st->top - 1];
}

获取栈内数据个数

//获取栈内数据个数
int STSize(ST* st)
{assert(st);return st->top;
}

项目实现

//头文件
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;
typedef struct stack
{STDataType* data;int top; //栈顶位置int capacity; //元素个数
}ST;//栈的初始化
void STInit(ST* st);
//栈的销毁
void STDestroy(ST* st);
//数据入栈
void STPush(ST* st, STDataType x);
//数据出栈
void STPop(ST* st);
//判断栈是否为空
bool STEmpty(ST* st);
//获取栈顶元素
STDataType STTop(ST* st);
//获取栈内数据个数
int STSize(ST* st);//实现文件
#include "stack.h"//栈的初始化
void STInit(ST* st)
{//判断是否存在队列assert(st);//初始化队列st->data = NULL;st->top = 0;//栈顶指针指向存储数据的下一个位置,代表栈内无数据//st->top = -1;//栈顶指针指向存储数据的位置,代表栈内无数据st->capacity = 0;
}//栈的销毁
void STDestroy(ST* st)
{//确保有栈的存在assert(st);//销毁栈free(st->data);st->data = NULL;//top和capacity更改为无数据的位置st->top = st->capacity = 0;
}//数据入栈
void STPush(ST* st, STDataType x)
{//确保有栈的存在assert(st);//向top位置增加数据,并使top向后移动//需要判断栈的容量大小if (st->top == st->capacity){//如果栈的空间为0,则开辟四个空间,如果栈容量不为0,则扩容原来容量的2倍int newCapacity = st->capacity == 0 ? 4 : st->capacity * 2;STDataType* tmp = (STDataType*)realloc(st->data, sizeof(STDataType) * newCapacity);assert(tmp);st->data = tmp;//注意更新容量大小st->capacity = newCapacity;}//数据压栈并改变topst->data[st->top++] = x;
}
//数据出栈
void STPop(ST* st)
{//确保有栈的存在assert(st);//确保栈不会越界assert(!STEmpty(st));//直接移动top指针,“看不见即删除”st->top--;
}
//判断栈是否为空
bool STEmpty(ST* st)
{//确保有栈的存在assert(st);//栈为空返回真,栈不为空返回假return st->top == 0;//判断表达式返回值只有1和0,如果为真返回1(true),如果为假返回0(false)
}
//获取栈顶元素
STDataType STTop(ST* st)
{//确保栈存在assert(st);//确保栈不为空assert(!STEmpty(st));//top为栈内数据的下一个位置,要获取当前位置的元素需要-1操作return st->data[st->top - 1];
}//获取栈内数据个数
int STSize(ST* st)
{assert(st);return st->top;
}//测试文件
#define _CRT_SECURE_NO_WARNINGS 1#include "stack.h"void test()
{ST st = { 0 };//初始化栈STInit(&st);//数据压栈STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);STPush(&st, 4);STPush(&st, 5);//打印栈内数据while (!STEmpty(&st)){//打印栈顶数据printf("%d ", STTop(&st));//数据出栈以打印下一个数据STPop(&st);}//栈的销毁STDestroy(&st);
}int main()
{test();return 0;
}

栈的基础练习

有效的括号

题目链接:20. 有效的括号 - 力扣(LeetCode)

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

思路解析:

本题可以使用栈来解决,当括号为左侧括号时,将括号存入栈内,当括号为右侧括号时,将该括号与栈顶的括号进行比较,比较一次进行一次出栈操作

📌

注意本题不一定要使用C语言来解决,因为C语言本身不支持泛型,需要单独先实现栈才能解题,本题使用C语言和栈的思路仅供参考

参考答案:

/** @lc app=leetcode.cn id=20 lang=c** [20] 有效的括号*/// @lc code=start
// 使用C语言和栈解决问题
// 栈的声明
typedef char STDataType;
typedef struct stack
{STDataType *data;int top;      // 栈顶位置int capacity; // 元素个数
} ST;// 栈的初始化
void STInit(ST *st);
// 栈的销毁
void STDestroy(ST *st);
// 数据入栈
void STPush(ST *st, STDataType x);
// 数据出栈
void STPop(ST *st);
// 判断栈是否为空
bool STEmpty(ST *st);
// 获取栈元素
STDataType STTop(ST *st);// 栈的实现
// 栈的初始化
void STInit(ST *st)
{// 判断是否存在队列assert(st);// 初始化队列st->data = NULL;st->top = 0; // 栈顶指针指向存储数据的下一个位置,代表栈内无数据// st->top = -1;//栈顶指针指向存储数据的位置,代表栈内无数据st->capacity = 0;
}// 栈的销毁
void STDestroy(ST *st)
{// 确保有栈的存在assert(st);// 销毁栈free(st->data);st->data = NULL;st->top = st->capacity = 0;
}// 数据入栈
void STPush(ST *st, STDataType x)
{// 确保有栈的存在assert(st);// 向top位置增加数据,并使top向后移动// 需要判断栈的容量大小if (st->top == st->capacity){// 如果栈的空间为0,则开辟四个空间,如果栈容量不为0,则扩容原来容量的2倍int newCapacity = st->capacity == 0 ? 4 : st->capacity * 2;STDataType *tmp = (STDataType *)realloc(st->data, sizeof(STDataType) * newCapacity);assert(tmp);st->data = tmp;st->capacity = newCapacity;}// 数据压栈并改变topst->data[st->top++] = x;
}
// 数据出栈
void STPop(ST *st)
{// 确保有栈的存在assert(st);// 确保栈不会越界assert(!STEmpty(st));// 直接移动top指针,“看不见即删除”st->top--;
}
// 判断栈是否为空
bool STEmpty(ST *st)
{// 确保有栈的存在assert(st);// 栈为空返回真,栈不为空返回假return st->top == 0; // 判断表达式返回值只有1和0,如果为真返回1(true),如果为假返回0(false)
}
// 获取栈元素
STDataType STTop(ST *st)
{// 确保栈存在assert(st);// 确保栈不为空assert(!STEmpty(st));// top为栈内数据的下一个位置,要获取当前位置的元素需要-1操作return st->data[st->top - 1];
}// 判断是否是有效括号
bool isValid(char *s)
{// 基本思路:左括号入栈,右括号时左括号出栈与右括号比较// 创建栈用于保存数据ST st = {0};// 初始化栈STInit(&st);// 数据入栈while (*s){if (*s == '(' || *s == '[' || *s == '{'){// 当是左括号时数据入栈STPush(&st, *s);}else{// 如果栈为空直接返回falseif (STEmpty(&st)){// 返回前释放空间,因为尽管没有数据,但是栈的空间已经开辟STDestroy(&st);return false;}// 当是右括号时数据出栈与右括号比较char top = STTop(&st);// 更新栈内元素STPop(&st);if ((*s == ')' && top != '(') || (*s == ']' && top != '[') || (*s == '}' && top != '{')){// 此处找不同,如果此处找相同,那么但凡出现一对满足的括号就会进入返回true//  返回之前销毁栈防止内存泄漏STDestroy(&st);return false;}}++s;}// 如果栈为空,则说明匹配完成,如果不为空说明栈内仍有括号没有匹配到,此时说明存在单独的括号bool ret = STEmpty(&st);// 返回之前销毁栈STDestroy(&st);return ret;
}
// @lc code=end

http://www.hkea.cn/news/117007/

相关文章:

  • 打广告型的营销网站西安百度推广外包
  • 乌鲁木齐招聘网站建设一站式网络营销
  • 中小型网站建设服务淘宝数据分析工具
  • 梧州网站设计企业网站模板建站
  • 行政事业单位网站建设建议营销策划公司
  • 网络推广网站怎么做百度联盟广告点击一次收益
  • wordpress居中样式宁波seo网络推广外包报价
  • java做网站用到哪些技术网络营销的重要性与意义
  • 网络营销推广的作用谷歌seo什么意思
  • 免费网站建设解决方案郑州网络营销公司哪个好
  • 转转怎么做钓鱼网站税收大数据
  • 株洲专业网站排名优化深圳产品网络推广
  • 深圳美食教学网站制作如何免费搭建自己的网站
  • 兰州移动端网站建设广东整治互联网霸王条款
  • 彩票网站该怎么建设天津seo实战培训
  • 原平的旅游网站怎么做的新冠疫情最新情况最新消息
  • 网站开发软件著作权归谁seo外包
  • 小说网站的网编具体做哪些工作南宁网站快速排名提升
  • 承德网站设计seo互联网营销培训
  • 工信部网站备案查询 手机seo专员的工作内容
  • 淘宝活动策划网站视频营销成功的案例
  • 精准营销数据杭州排名优化软件
  • 中卫网站建站设计seo学习论坛
  • wordpress初始登录seo排名赚app靠谱吗
  • 软件外包保密协议seo相关岗位
  • 后台网站开发文档下载班级优化大师app
  • 辛集城乡建设管理局网站网络营销网络推广
  • 阿里云部署一个自己做的网站吗电商网站搭建
  • 免费汽车租赁网站模板网站域名解析ip查询
  • 企业解决方案官网国内seo排名分析主要针对百度