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

网站的建设外链优化网络推广公司排行榜

网站的建设外链优化,网络推广公司排行榜,怎样建设网站的步骤,今天石家庄出什么事了文章目录 1. 栈的概念2. 栈的分类3. 栈的实现(数组栈)3.1 接口设计(Stack.h)3.2 接口实现(Stack.c)1)初始化销毁2)栈顶插入删除3)栈顶元素、空栈、大小 3.3 完整代码Stac…

文章目录

  • 1. 栈的概念
  • 2. 栈的分类
  • 3. 栈的实现(数组栈)
    • 3.1 接口设计(Stack.h)
    • 3.2 接口实现(Stack.c)
      • 1)初始化销毁
      • 2)栈顶插入删除
      • 3)栈顶元素、空栈、大小
    • 3.3 完整代码
      • Stack.h
      • Stack.c
      • test.c
      • 注意:
      • 运行效果

1. 栈的概念

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

遵循的原则是:后进先出

结构概念

2. 栈的分类

栈的实现有3种方式

2.1 数组栈:栈底是数组头,栈顶是数组尾。

数组栈

2.2 链式栈:

1)双向链表实现: 栈顶可以是尾也可以是头

2)单向链表实现: 栈顶只能是头(开销小)

链表栈

栈的实现一般可以使用以上方式实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

3. 栈的实现(数组栈)

下面将其分为3个模块进行实现Stack.h,Stack.c,test.c

3.1 接口设计(Stack.h)

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;typedef struct Stack
{STDataType *a;//这里是可以指向栈顶的,那下面的写法就要做对应修改int top;		//这里则是标识栈顶位置下一个int capacity;
}ST;//初始化销毁扩容
void STInit(ST* pst);
void STDestroy(ST* pst);
void CheckCapacity(ST* pst);
//栈顶插入删除
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//栈顶元素、空栈、大小
STDataType STTop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);

3.2 接口实现(Stack.c)

1)初始化销毁

这里需要讨论一些 top 的指向问题:

如果 top 指向栈顶元素位置,则初始化时 top = -1 ;这时要push时要先对 top ++后赋值。

如果 top 指向栈顶元素下一个位置,则初始化时 top == 0 ;这时要push时要先对 top 赋值后++。

这里采用第二种写法。

void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;这里初始化为-1,表示指向栈顶元素//pst->top = 0;//这里初始化为0,表示指向栈顶下一个元素pst->top = 0;
}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}

2)栈顶插入删除

删除这里要判断 top > 0 ,和结构定义一致

void STCheckCapacity(ST* pst)
{if (pst->capacity == pst->top){int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("relloc fail\n");exit(-1);}pst->a = tmp;pst->capacity = newCapacity;}
}void STPush(ST* pst, STDataType x)
{assert(pst);STCheckCapacity(pst);pst->a[pst->top++] = x;
}void STPop(ST* pst)
{assert(pst);//不为空assert(pst->top > 0);pst->top--;
}

3)栈顶元素、空栈、大小

在判断空栈有个小技巧:即直接返回判断语句即可,因为他们的结果也是对或错

STDataType STTop(ST* pst)
{assert(pst);//不为空assert(pst->top > 0);return pst->a[pst->top - 1];
}bool STEmpty(ST* pst)
{assert(pst);1//if (pst->top == 0)//{//	return true;//}//else//{//	return false;//}2//return pst->top == 0 ? true : false;//3return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}

3.3 完整代码

Stack.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int STDataType;typedef struct Stack
{STDataType *a;int top;		//标识栈顶位置int capacity;
}ST;//初始化销毁
void STInit(ST* pst);
void STDestroy(ST* pst);
void STCheckCapacity(ST* pst);
//栈进栈出
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);
//栈顶元素、空栈、大小
STDataType STTop(ST* pst);
bool STEmpty(ST* pst);
int STSize(ST* pst);

Stack.c

#include "Stack.h"//初始化销毁
void STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;这里初始化为-1,表示指向栈顶元素//pst->top = 0;//这里初始化为0,表示指向栈顶下一个元素pst->top = 0;
}void STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}void STCheckCapacity(ST* pst)
{if (pst->capacity == pst->top){int newCapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("relloc fail\n");exit(-1);}pst->a = tmp;pst->capacity = newCapacity;}
}//栈进栈出
void STPush(ST* pst, STDataType x)
{assert(pst);STCheckCapacity(pst);pst->a[pst->top++] = x;
}void STPop(ST* pst)
{assert(pst);//不为空assert(pst->top > 0);pst->top--;
}//栈顶元素、空栈、大小
STDataType STTop(ST* pst)
{assert(pst);//不为空assert(pst->top > 0);return pst->a[pst->top - 1];
}bool STEmpty(ST* pst)
{assert(pst);1//if (pst->top == 0)//{//	return true;//}//else//{//	return false;//}2//return pst->top == 0 ? true : false;//3return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}

test.c

#include "Stack.h"void STTest()
{ST s;STInit(&s);STPush(&s, 1);STPush(&s, 2);STPush(&s, 3);STPush(&s, 4);STPush(&s, 5);STPush(&s, 6);STPush(&s, 7);STPush(&s, 8);STPush(&s, 9);printf("栈顶元素是 %d, 栈个数为 %d\n", STTop(&s), STSize(&s));//访问栈只能先打印栈顶,然后出栈,然后继续访问//入栈顺序和出栈顺序是一对多的关系printf("打印栈全部元素: \n");while (!STEmpty(&s)){printf("%d ", STTop(&s));STPop(&s);}printf("\n");printf("销毁栈\n");STDestroy(&s);
}int main()
{STTest();return 0;
}

注意:

1)访问栈只能先打印栈顶,然后出栈,然后继续访问,访问完成栈也就为空了
2)入栈顺序和出栈顺序是一对多的关系,判断顺序可以模拟过程就能判断哪种顺序是错的

运行效果

栈运行结果

http://www.dtcms.com/wzjs/170445.html

相关文章:

  • 企业模式网站列表管理器广州网站优化运营
  • 做兼职的网站有哪些什么是搜索引擎优化?
  • 泰安住房和城乡建设厅网站免费推广公司的网站
  • 网站开发是用模版还是纯手打太原百度推广排名优化
  • 友汇网 做公司网站网络推广员是干嘛的
  • 同步网站内容怎么做seo中文意思
  • 单页网站建设哪个品牌好做公司网站
  • java做的网站影响seo排名的因素有哪些
  • 如何做网站微信支付网站搜索排名优化价格
  • 网站开发的论文怎么写营销策略ppt模板
  • 北京文化传媒有限公司网站建设阿里云域名
  • 人才微网站开发seo站长综合查询
  • 美德的网站建设连云港网站seo
  • wordpress 最后一页朝阳seo搜索引擎
  • 中小企业网站建设多少钱百度seo搜索引擎优化培训
  • 做一个小程序seo营销的概念
  • 自助建设手机网站网络营销乐云seo
  • 郴州网站建设设计制作营销推广方案案例
  • 汇川区住房和城乡建设厅网站网络营销的真实案例分析
  • 设计师网站behanceseo培训学校
  • 网站建设可用性的五个方面西安搜建站科技网站
  • 天圆地方建筑网站引擎优化seo
  • 如何设计一个网页并举例说明郑州seo公司哪家好
  • 沃通 wordpressseo每天一贴博客
  • 网站在线报名怎么做外贸推广平台有哪几个
  • 南京的电商网站设计网页设计培训
  • 成都响应式网站建设网络推广人员
  • 聊城房地产网站建设如何打百度人工电话
  • wordpress可以管理现有网啊上海网络优化服务
  • 网站建设技术人员招聘广州网络营销公司