数据结构栈及其用法(C语言实现)

一、栈的定义

栈是限定仅在表尾进行插入或删除操作的线性表。一次对栈来说,表尾端有其特殊的含义,称为栈顶,相应

的,表头端成为栈底。不含元素的空表称为空栈。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

二、栈的特点

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据

,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。所以,我们又称栈为后进先出,即
last in first out,简称LIFO结构。它的结构图如下:

三、栈的基本操作

由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈和链栈两种存储结构,这两种存储结

构的不同,则使得实现栈的基本运算的算法也有所不同。

顺序栈,即栈的顺序存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。在顺序栈中有上

溢和下溢的概念。顺序栈就想在一个盒子里放书一样,你要拿书只能从最上面拿,如果书本放到盒子中,超过合资的顶部,那么便是上溢。反正如果没有书了,我们还去拿书,那么便是下溢。

而链栈没有上溢的限制,它只需要在头部进行操作,我们在要存储大量数据元素的时候才会用到链栈,一般情

况都是用顺序栈。因此下面我给出顺序栈的例子:

#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
const int stack_size = 100;
const int stackcreament = 10;
typedef struct sqstack
{
    int *base;      //栈底指针
    int *top;       //栈顶指针
    int stacksize;
}sqstack;
void initstack(sqstack *s)      //构造一个空栈
{
    (*s).base = (int *)malloc(sizeof(int) * stack_size);
    if(!(*s).base)
        exit(0);
    (*s).top = (*s).base;
    (*s).stacksize = stack_size;
}
void destory(sqstack &s)        //销毁一个栈
{
    free(s.base);
    s.base = NULL;
    s.top = NULL;
    s.stacksize = 0;
}
void clearstack(sqstack &s)     //清空一个栈
{
    s.top = s.base;
}
bool emptystack(sqstack &s)     //判断一个栈是否为空
{
    if(s.top == s.base)
        return 1;
    return 0;
}
int lengthstack(sqstack &s)     //返回这个栈的长度
{
    return s.top - s.base;
}
int gettop(sqstack &s)          //取栈顶元素
{
    if(s.base == s.top)
        return 0;
    return *(s.top-1);
}
int push(sqstack &s, int data)      //插入新的元素作为栈顶元素
{
    if(s.top - s.base >= s.stacksize) //栈满,追加空间
    {
        s.base = (int *)realloc(s.base, (s.stacksize+stackcreament)*sizeof(int));
        s.top = s.base + s.stacksize;
        s.stacksize += stackcreament;
    }
    *(s.top) = data;
    s.top++;
}
int pop(sqstack &s)             //删除栈顶元素
{
    if(s.base == s.top)
        return 0;
    s.top--;

}
int main()
{
    sqstack s;
    initstack(&s);
    for(int i=0;i<10;i++)
        push(s, i);
    for(int i=0;i<10;i++)
    {
        int a = gettop(s);
        printf("%d  ", a);
        pop(s);
    }
    printf("\n");
    if(emptystack(s) == 1)
        printf("不为空\n");
    int len = lengthstack(s);
    printf("%d\n", len);
    destory(s);

    return 0;
}

栈的几个典型应用的例子:数制的转换, 括号匹配的检查, 行编辑程序等等, 都是利用栈的先进后出特征来进行求解的。

时间: 2024-11-05 14:38:50

数据结构栈及其用法(C语言实现)的相关文章

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

数据结构 栈笔记

// 数据结构 栈的实现 C语言, 只能从头部储存和销毁数据 # include <stdio.h> # include <stdlib.h> # include <malloc.h> // 线性储存部分 typedef struct NONE { int data; struct NONE * pNext; }None, * pNone; // 栈的头部和底部 typedef struct stack { pNone top; pNone bottom; }St, *

数据结构——栈——寻找下一个较大元素

题目描述 给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1 举例 {4,6,1,3,2,5} 则求得的答案应为 {6,-1,3,5,5,-1} 题目分析 首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了.时间复杂度应该是n^2 但是这样肯定是不够用的. 然后我们考虑,这道题我们实际上遇到的问题是什么? 其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值. 难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

数据结构-栈、队列和链表

一.栈stack 是后进先出的数据结构 栈顶指针指的始终是栈最上方元素的一个标记,即放在最上面的元素.栈顶元素为空时令top为-1. 在使用pop()函数和top()函数时,需要使用empty()判断栈是否为空. 在STL中stack容器来编写代码,STL定义stack的复杂度是O(1). 常见函数: clear() size() empty() push() pop() top() 二.队列queue 是一种先进先出的数据结构 需要一个队首指针front来指向队首元素的前一个位置,而使用一个队

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双

poj 2082 Terrible Sets (数据结构 ——栈 STL)

 Terrible Sets Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2999   Accepted: 1549 Description Let N be the set of all natural numbers {0 , 1 , 2 , . . . }, and R be the set of all real numbers. wi, hi for i = 1 . . . n are some elem

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的