1、栈:仅在表尾进行插入和删除操作的线性表。后进先出LIFO。

1)表尾端(允许插入和删除的一端)为栈顶,表头端(不允许插入和删除的一端)为栈底。

2)入栈:插入元素的操作。出栈:删除栈顶元素

3)栈的应用:数值转化、括号匹配检验、行编辑程序、迷宫求解、表达式求值

2、栈的两种存储表示方式

1)顺序栈(栈的顺序存储结构):利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。top=0表示空栈。

2)链栈(栈的链式存储结构);优点是便于多个栈共享存储空间和提高效率。

3、括号匹配检验

1)左括号,则进栈。

2)右括号,若栈为空,则右括号多。

3)右括号,与栈顶元素比较,若相等则左括号出栈,若不相等则不匹配。

4)表达式检验结束时,若栈空则匹配成功,否则左括号多。

4、栈的基本操作

InitStack(&S):构造空栈

DestroyStack(&S):销毁栈

ClearStack(&S):清空栈

StackEmpty(S):判断栈是否为空,若为空则返回true,否返回false

StackLength(S):返回栈的长度

GetTop(S,&e):用e返回栈的栈顶元素

Push(&S,e):插入e为新栈顶

Pop(&S,&e):删除栈顶元素,并用e返回其值。

5、共享栈:利用栈底位置相对不变性的特性,使得两个顺序栈共享一个一维数据空间,将两个栈底设置在共享空间的两端。

1)top0=-1时0号栈为空,top1=maxsize时1号栈为空,仅当两个栈顶指针相邻(top1-top0=1)时,栈满。

2)当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减1在赋值。

6、栈的顺序存储类型描述

#define maxsize 50
typedef struct {
 int data[maxsize];
 int top;//栈顶指针,初始时设置S.top=-1,栈顶元素为:S.data[S.top],栈空条件:S.top==-1栈满条件:S.top==maxsize-1栈长:S.top+1
}Sqstack;
1)初始化栈
void initstack(Sqstack &S)
{
 S.top = -1;
}
2)判断栈空
bool stackempty(Sqstack S)
{
 if (S.top == -1)
 {
  return true;
 }
 else
 {
  return false;
 }
}
3)进栈
bool push(Sqstack &S, int e)
{
 if (S.top == maxsize - 1)
 {
  return false;
 }
 S.data[++S.top] = e;
 return true;
}
5)出栈
bool pop(Sqstack &S, int &e)
{
 if (S.top == -1)
 {
  return false;
 }
 e = S.data[S.top--];
 return true;
}
6)读栈顶元素
bool GetTop(Sqstack S, int &e)
{
 if (S.top == -1)
 {
  return false;
 }
 e = S.data[S.top--];
 return true;
}
7、栈的链式存储结构类型描述
typedef struct Linkstack {
 int data;
 struct Linkstack *next;
}*Listack;
8、一些基本问题的解决
1)以IO分别表示入栈和出栈操作,栈的初态和终态都为空,可以操作的序列称为合法序列,判断序列是否合法。
int judge(cha A[])
{
 int i = j = k = 0;
 while (A[i]!='\0')
 {
  switch (A[i])
  {
  case 'I':j++;
   break;
  case 'O':k++;
   if (k > j)
   {
    printf("序列非法\n");
    exit(0);
   }
  }
  i++;
 }
 if (j != k)
 {
  printf("序列非法");
  return false;
 }
 else
 {
  printf("序列合法");
  return true;
 }
}
2)设栈S1,S2都擦用顺序栈,并共享一个存储区[0,...,maxsize-1],采用栈顶相向、迎面增长的存储方式,出栈和入栈的实现。i为栈号,i=0表示左边的栈s1,i=1表示右边的栈s2,e为入栈元素。
typedef struct {
 int stack[maxsize];
 int top[2];
}stk;
stk s;
//入栈
int push1(int i, int e)
{
 if (i < 0 || i>1)
 {
  printf("栈号输入错误");
  exit(0);
 }
 if (s.top[1] - s.top[0] == 1)
 {
  printf("栈以满\n");
  return 0;
 }
 switch (i)
 {
 case 0:s.stack[++s.top[0]] = e;
  return 1;
  break;
 case 1:s.stack[--s.top[1]] = e;
  return 1;
 }
}
//出栈
int pop1(int i)
{
 if (i < 0 || i>1)
 {
  printf("栈号输入错误\N");
  exit(0);
 }
 switch (i)
 {
 case 0:
  if (s.top[0] == -1)
  {
   printf("栈空\n");
   return -1;
  }
  else
  {
   return s.stack[s.top[0]--];
  }
 case 1:
  if (s.top[1] == maxsize)
  {
   printf("栈空\n");
   return -1;
  }
  else
  {
   return s.stack[s.top[1]++];
  }
 }
}

数据结构(C语言版)---栈的更多相关文章

  1. 数据结构C语言版-栈

    #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream> ...

  2. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  3. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  4. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  5. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  6. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  7. 【数据结构(C语言版)系列二】 栈

    栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...

  8. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  9. 深入浅出数据结构C语言版(7)——特殊的表:队列与栈

    从深入浅出数据结构(4)到(6),我们分别讨论了什么是表.什么是链表.为什么用链表以及如何用数组模拟链表(游标数组),而现在,我们要进入到对线性表(特意加了"线性"二字是因为存在多 ...

  10. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

随机推荐

  1. Hive面试准备

    Hive与HBase的区别Hive架构原理Hive的数据模型及各模块的应用场景Hive支持的文件格式和压缩格式及各自特点Hive内外表的区分方法及内外部差异Hive视图如何创建.特点及应用场景Hive ...

  2. 强化学习之一:从TensorFlow开始(Start from TensorFlow)

    本文是对Tensorflow官方教程的个人(tomqianmaple@outlook.com)中文翻译,供大家学习参考. 官方教程链接 tf的扬帆起航Getting Started With Tens ...

  3. 探索学习率设置技巧以提高Keras中模型性能 | 炼丹技巧

      学习率是一个控制每次更新模型权重时响应估计误差而调整模型程度的超参数.学习率选取是一项具有挑战性的工作,学习率设置的非常小可能导致训练过程过长甚至训练进程被卡住,而设置的非常大可能会导致过快学习到 ...

  4. HDU - 1503 最长公共子序列记录路径

    题意:先给两个水果的名字然后得出一个最短的序列包含这两个词. 思路:我一开始的思路是先求出最长公共子序列,然后做一些处理将其他的部分输出来:两种水果的字符串和最长公共子序列的字符串这三个字符串做对比, ...

  5. CSRF的几种防御方法的利弊分析

    本文直接从防御方式开始讨论,防御CSRF有4种方法: 使用POST替代GET 检验HTTP Referer 验证码 Token 使用POST替代GET 一些程序员在开发的时候都是用GET.POST通用 ...

  6. Unix 网络编程卷一源码编译踩坑记录 ubtutu 19.10

    在阅读unpv1时运行源代码的环境配置,这里简单记录一下 源代码里的README 写得挺详细的,但是在Linux 系统的下还没没办法直接编译通过的, 这里我使用的是ubuntu 19.10(在腾讯云1 ...

  7. MATLAB 概率论题

    1. 用模拟仿真的方法求解 clc clear tic n=0; N=100000; for ii=1:N b='MAXAM'; %字符串格式 a=randperm(5); % b=[b(a(1)), ...

  8. Django之extra过滤

    extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None) 有些 ...

  9. 【django】 django后台管理 导出excel表

    from django.contrib import admin # Register your models here. import xlwt from django.http import Ht ...

  10. jmeter实现接口关联的两种方式:正则表达式提取器和json提取器看这篇就够了

    一.前言在开展接口测试或者是接口面试的过程中,我们会发现很多接口需要依赖前面的接口,需要我们动态从前面的接口返回中提取数据,也就是我们通常说的关联. 关联通俗来讲就是把上一次请求的返回内容中的部分截取 ...