栈入门

线性结构的两种常见应用之一栈
定义:一种可以实现”先进后出”的存储结构,栈类似于箱子
分类:静态栈、动态栈
算法:出栈、压栈

 

栈的定义:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈的逻辑定义、特点及运算:

栈是限定在表的一端进行插入和删除的运算的线性表,通常将插入、删除的一端称为栈顶,另一端称为栈底。不含元素的空表称为空栈。栈的操作具有先进后出或后进先出的特点。栈的运算主要有置空栈、判栈空、判栈满、进栈、退栈、和取栈顶元素6种。

基本概念

要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。"栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。

首先系统或者数据结构栈中数据内容的读取与插入(压入push和 弹出pop)是两回事!压入是增加数据,弹出是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

栈可以用来在函数调用的时候存储断点,做递归时要用到栈!

以上定义是在经典计算机科学中的解释。

在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。

栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

1.函数的返回地址和参数

2. 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。

基本算法

1.进栈(PUSH)算法

①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);

②置TOP=TOP+1(栈指针加1,指向进栈地址);

③S(TOP)=X,结束(X为新进栈的元素);

2.退栈(POP)算法

①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);

②X=S(TOP),(退栈后的元素赋给X):

③TOP=TOP-1,结束(栈指针减1,指向栈顶)。

 

栈分顺序栈和链式栈,下面程序介绍了顺序栈的实现。

pascal

1.数组型

Const

m=栈表目数的上限;

Type

stack=array[1..m] of stype; {栈类型}

Var

s:stack;{栈}

top:integer;

2.记录型

const

m=栈表目数的上限;

type

stack=record

elem: array[1..m] of elemtp;

top:0..m; {栈顶指针}

end;

Var

s:stack;{栈}

C++代码

#include <iostream>
#include <stdio.h>
#include <malloc.h>class SqStack{private:
enum { MaxSize = 100 };int data[MaxSize];int top;public:SqStack();~SqStack();bool isEmpty();void pushInt(int x);int popInt();int getTop();void display();};SqStack::SqStack(){top = -1;}SqStack::~SqStack() {}bool SqStack::isEmpty(){  //判断栈为空return(top == -1);}void SqStack::pushInt(int x){  //元素进栈if (top == MaxSize - 1){std::cout << "栈上溢出!" << std::endl;}else{++top;data[top] = x;}
}int SqStack::popInt(){   //退栈int tmp = 0;if (top == -1){std::cout << "栈已空!" << std::endl;}else{tmp = data[top--];}return tmp;
}int SqStack::getTop(){  //获得栈顶元素int tmp = 0;if (top == -1){std::cout << "栈空!" << std::endl;}else{tmp = data[top];}return tmp;}void SqStack::display(){  //打印栈里元素std::cout << "栈中元素:" << std::endl;for (int index = top; index >= 0; --index){std::cout << data[index] << std::endl;}}int main(){SqStack st;std::cout << "栈空:" << st.isEmpty() << std::endl;for (int i = 1; i < 10; i++){st.pushInt(i);}st.display();std::cout << "退一次栈" << std::endl;st.popInt();std::cout << "栈顶元素:" << st.getTop() << std::endl;st.popInt();st.display();return 0;}

 

C代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

#include <stdio.h>

#include <malloc.h>

 

#define DataType int

#define MAXSIZE 1024

 

typedef struct{

    DataType data[MAXSIZE];

    int top;

}SeqStack;

 

SeqStack* Init_SeqStack(){  //栈初始化

    SeqStack* s;

    s = (SeqStack*)malloc(sizeof(SeqStack));

    if(!s){

        printf("空间不足\n");

        return NULL;

    }else{

        s->top = -1;

        return s;

    }

}

 

int Empty_SeqStack(SeqStack* s){  //判栈空

    if(s->top == -1)

        return 1;

    else

        return 0;

}

 

int Push_SeqStack(SeqStack* s, DataType x){  //入栈

    if(s->top == MAXSIZE - 1)

        return 0;//栈满不能入栈

    else{

        s->top++;

        s->data[s->top] = x;

        return 1;

    }

}

 

int Pop_SeqStack(SeqStack* s, DataType* x){  //出栈

    if(Empty_SeqStack(s))

        return 0;//栈空不能出栈

    else{

        *x = s->data[s->top];

        s->top--;

        return 1;

    }//栈顶元素存入*x,返回

}

 

DataType Top_SeqStack(SeqStack* s){  //取栈顶元素

    if(Empty_SeqStack(s))

        return 0;//栈空

    else

        return s->data[s->top];

}

 

int Print_SeqStack(SeqStack* s){

    int i;

    printf("当前栈中的元素:\n");

    for(i = s->top; i >= 0; i--)

        printf("%3d", s->data[i]);

    printf("\n");

    return 0;

}

 

int main(){

    SeqStack* L;

    int n, num, m;

    int i;

     

    L = Init_SeqStack();

     

    printf("初始化完成\n");

    printf("栈空:%d\n", Empty_SeqStack(L));

    printf("请输入入栈元素个数:\n");

    scanf("%d", &n);

    printf("请输入要入栈的%d个元素:\n", n);

     

    for(i = 0; i < n; i++){

        scanf("%d", &num);

        Push_SeqStack(L, num);

    }

     

    Print_SeqStack(L);

     

    printf("栈顶元素:%d\n", Top_SeqStack(L));

    printf("请输入要出栈的元素个数(不能超过%d个):\n", n);

    scanf("%d", &n);

    printf("依次出栈的%d个元素:\n", n);

     

    for(i = 0; i < n; i++){

        Pop_SeqStack(L, &m);

        printf("%3d", m);

    }

     

    printf("\n");

    Print_SeqStack(L);

    printf("栈顶元素:%d\n", Top_SeqStack(L));

     

    return 0;

}

定义stack的简单代码:

stack<int> sta;

入栈:sta.push(x);

出栈:sta.pop();

判断栈的大小: sta.size();

判断栈是否为空:sta.empty();

 

 左栈有堆(静态分配的是在栈里,动态分配的是在堆里)

#include <stdio.h>
#include <malloc.h>
void f(int k)
{int m;double * q = (double *)malloc(200);
}
int main(void) {int i = 10;int * p= (int *)malloc(100);return 0;
}

 

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

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

相关文章

Packet Tracer 5.0实验(四) 利用三层交换机实现VLAN间路由

一、实验目标 掌握交换机Tag VLAN 的配置&#xff1b;掌握三层交换机基本配置方法&#xff1b;掌握三层交换机VLAN路由的配置方法&#xff1b;通过三层交换机实现VLAN间相互通信&#xff1b;二、实验背景 某企业有两个主要部门&#xff0c;技术部和销售部&#xff0c;分处于不同…

栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

noi 2009 二叉查找树 动态规划

思路&#xff1a; 先把权值离散化 按数据值排序 sum[i]为前i个节点频度和 dp[i][j][w]表示把节点[i,j]合并成一颗根节点权值不小于w的子树所需的访问代价与修改代价的最小和 dp[i][j][w]min(dp[i][k-1][w]dp[k1][j][w]sum[j]-sum[i-1]K,dp[i][k-1][a[k].weight]dp[k1][j][a[k].…

出栈程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

不管你挣多少钱永远都是问题

近几个月太多事情&#xff0c;太多变化&#xff0c;一直没有心情写博客&#xff0c;今天补上一篇吧&#xff01; 我会一直在这里坚持下去的&#xff01;他年收入100多万开着一辆宝马5&#xff0c;天天被应酬折腾的要死要活&#xff0c;真想狠狠心不干了&#xff0c;当初干嘛非要…

栈清空程序演示

#include <stdio.h> #include <malloc.h> #include <stdlib.h>typedef struct Node{int data;struct Node * pNext; }NODE,*PNODE;typedef struct Stack{PNODE pTop; //栈顶元素PNODE pBottom; //栈底部元素 }STACK,*PSTACK;void init(PSTACK); v…

hdu 1325 Is It A Tree?

题目链接 #include"stdio.h" int set[1001],v[1001],cnt[10001],flag; //初始化 void fun() {int i;flag1;for(i1;i<1000;i){set[i]i;v[i]0;cnt[i]0;} } //查找根节点 int find(int x) {return xset[x]?x:find(set[x]); } int judge() {int i,t;for(i1;i<1000…

数据库的介绍

##本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ …

InfoPath Resource Sites

http://blogs.msdn.com/infopath_support/archive/2009/11/09/9919841.aspx转载于:https://www.cnblogs.com/mingle/archive/2012/07/24/2606277.html

MySQL的常见命令

###MySQL的常见命令 1.查看当前所有的数据库 show databases; 2.打开指定的库 use 库名 3.查看当前库的所有表 show tables; 4.查看其它库的所有表 show tables from 库名; 5.创建表 create table 表名( 列名 列类型, 列名 列类型…

算法导论 CLRS 22.4-4 解答

先说结论&#xff1a; 对于有环图&#xff0c;top排序不一定可以生成坏边最小的序列 证明&#xff1a; 1. 假设G至少需要去掉k条边才能变成无环图&#xff0c;则任意序列P的坏边数目bad[P] > k&#xff1b; 证明&#xff1a; 如果存在P使得bad[P] < k, 则只要去掉P中的坏…

MySQL DQL语言的笔记

##DQL语言的学习 ###进阶1&#xff1a;基础查询 语法&#xff1a; SELECT 要查询的东西 【FROM 表名】; 类似于Java中 :System.out.println(要打印的东西); 特点&#xff1a; ①通过select查询完的结果 &#xff0c;是一个虚拟的表格&#xff0c;不是真实存…

MySQL学习笔记——显示数据库信息

show privileges 显示可用的系统权限清单。   View Code mysql> show privileges;-----------------------------------------------------------------------------------------------------------------------| Privilege | Context …

MySQL DML语言笔记

##DML语言 ###插入 语法&#xff1a; insert into 表名(字段名&#xff0c;...) values(值1&#xff0c;...); 特点&#xff1a; 1、字段类型和值类型一致或兼容&#xff0c;而且一一对应 2、可以为空的字段&#xff0c;可以不用插入值&#xff0c;或用null填充…

2012年7月份第4周51Aspx源码发布详情

变幻球游戏源码 2012-7-27[VS2010] 游戏规则&#xff1a;球变色顺序: 绿->黄->橙->红->爆炸&#xff0c;在GO完后就可以开始不停拨球&#xff0c;任何颜色都可以拨球&#xff0c;让其重新计时&#xff0c;否则等它们同时变出一大片黄色&#xff0c;会应接不暇&…

MySQL DDL语言笔记

##DDL语句 ###库和表的管理 库的管理&#xff1a; 一、创建库 create database 库名 二、删除库 drop database 库名 表的管理&#xff1a; #1.创建表 CREATE TABLE IF NOT EXISTS stuinfo( stuId INT, stuName VARCHAR(20), …

生成指定大小的空文件

dd if/dev/zero ofM.file bs1M count50 生文件名为 M.file的空文件&#xff0c;写 50 次&#xff0c;每次写1M&#xff1b;转载于:https://www.cnblogs.com/bluebbc/archive/2012/08/03/2621284.html

MySQL事务介绍

##数据库事务 ###含义 通过一组逻辑操作单元&#xff08;一组DML——sql语句&#xff09;&#xff0c;将数据从一种状态切换到另外一种状态 ###特点 &#xff08;ACID&#xff09; 原子性&#xff1a;要么都执行&#xff0c;要么都回滚 一致性&#xff1a;保证…

【原】unity3D ios 退出保存数据(2)

前一篇退出保存数据仅试用于ipad1 ipad2 、phone4s及以前版本&#xff0c;不适用于new pad(不支持后台渲染) 所以修改了前文&#xff0c;以此适应现有的所有ios设备. 实现如下&#xff1a; void OnApplicationPause(bool pause) { if(pause)//暂停游戏 { …

队列入门简介

线性结构的两种常见应用之二队列 定义:种可以实现“先进先出”的存储结构 分类:链式队列(链表实现)、静态队列(数组实现) 队列&#xff08;常用数据结构之一&#xff09; 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行…