c语言数据结构之栈的基本操作

栈是限定仅在表尾进行插入或者删除操作的线性表。各位也可以到360云盘中下载完整程序,运行环境为vc++6.0

http://yunpan.cn/cVKkv9fmsp4wB  访问密码 b737

1 typedef struct
2 {
3     SelemType *base;
4     SelemType *top;
5     int        stacksize;
6 }SqStack;

现在来介绍下栈的操作实现。

/********************************************************************
函数名称:  InitStack
函数作用:  构造一个空栈
输入参数:  s
输出参数:  无
返回值:    FALSE or TRUE
********************************************************************/
Status InitStack(SqStack &s)
{
   s.base=(SelemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType));  //申请空间
   if(!s.base) return FALSE;    //如果申请不成功,返回FALSE
   s.top=s.base;                //申请成功,令栈顶指针等于栈尾指针
   s.stacksize=STACK_INIT_SIZE; //stacksize表示申请分配的空间大小
   return TRUE;
}
/********************************************************************
函数名称:  Push
函数作用:  将元素e入栈
输入参数:  栈s,元素e
输出参数:  无
返回值:    FALSE or TRUE
时间复杂度:O(1)
********************************************************************/
Status Push(SqStack &s,SelemType e)
{
   if((s.top-s.base)>=s.stacksize)
   {
     s.base=(SelemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SelemType));
     if(!s.base) return FALSE;
     s.top=s.base+s.stacksize;
     s.stacksize+=STACKINCREMENT;
   }
   *s.top++=e;
   return TRUE;
}
/********************************************************************
函数名称:  StackBrower
函数作用:  遍历
输入参数:  栈s
输出参数:  无
返回值:    FALSE or TRUE
时间复杂度:O(n)
********************************************************************/
Status StackBrower(SqStack s)
{
    if(!s.base)
    {
        cout<<"不存在栈s"<<endl;
        return FALSE;
    }
    if(s.top==s.base)
    {
        cout<<"s为空栈"<<endl;
        return FALSE;
    }
    while(!(s.top==s.base))
    {
       cout<<*(--s.top)<<"  ";
    }
    cout<<endl;
    return TRUE;
}
/********************************************************************
函数名称:  DestroyStack
函数作用:  销毁空栈
输入参数:  栈s
输出参数:  无
返回值:    FALSE or TRUE
时间复杂度:O(1)
********************************************************************/
Status DestroyStack(SqStack &s)
{
   free(s.base);          //只需要释放base指针
   s.base=NULL;
   return TRUE;
}   
/********************************************************************
函数名称:  ClearStack
函数作用:  销毁空栈
输入参数:  栈s
输出参数:  无
返回值:    FALSE or TRUE
时间复杂度:O(1)
********************************************************************/
Status ClearStack(SqStack &s)
{
    if(s.top==s.base) return TRUE;
    s.top=s.base;
    return TRUE;
}  
/********************************************************************
函数名称:  StackEmpty
函数作用:  判断是否为空栈
输入参数:  栈s
输出参数:  无
返回值:    0非空栈 or 1空栈
时间复杂度:O(1)
********************************************************************/
Status StackEmpty(SqStack &s)
{
   return(s.base==s.top);
}
/********************************************************************
函数名称:  StackLength
函数作用:  获取当前储存数据的长度
输入参数:  栈s
输出参数:  无
返回值:    栈长
时间复杂度:O(1)
********************************************************************/
int    StackLength(SqStack s)
{
 return (s.top-s.base);
}

Status GetTop(SqStack s,SelemType &e)
{
  e=*(s.top-1);
  return TRUE;
}

接下来就是main函数测试代码

#include"StackLib.h"

void main()
{
  int e[20];
  int i=0;
  int a;
  for(i=0;i<20;i++) e[i]=i;
  SqStack s;
  InitStack(s);           //构造一个空栈
  for(i=0;i<20;i++)
  {
      Push(s,e[i]);       //数据入栈
  }

  StackBrower(s);         //遍历堆栈
  cout<<"当前储存数据:"<<StackLength(s)<<"个"<<endl;

  GetTop(s,a);            //获得栈顶元素,并打印
  cout<<a<<endl;

  ClearStack(s);          //清空栈
  StackBrower(s);         //遍历栈
  cout<<"1为空栈,0非空:"<<StackEmpty(s)<<endl;  //判断栈是否为空

  DestroyStack(s);        //销毁堆栈
  StackBrower(s);         //
}
时间: 2024-10-07 20:34:57

c语言数据结构之栈的基本操作的相关文章

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋值*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define OK 1#define ERROR 0#define NAMESIZE 255//字符串的最大长度

数据结构之栈定义及基本操作实现

终于有可以有时间写点数据结构的学习总结了,前段时间一直在紧张的忙一些项目,都没有空出时间来学习数据结构,现在终于可以稍微喘口气了,还是数据结构有意思,这两天看了点栈的东西,写下来总结一下,有错误的地方希望看到的朋友指出来,感激不尽. 根据学习,栈就是一种线性数据结构,栈的运算只能在表的一段进行,所以这种数据结构具有“后进先出”的特点. 接下来是栈的c语言实现.其中栈由一个top节点和bottom节点组成,这两个节点分别指向栈的顶部和底部.其中栈的组成结点是由结构体实现,结构体由数据库和指向下一个

C语言数据结构——第三章 栈和队列

三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构. 从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型. 3.1-栈 3.1.1-抽象数据类型栈的定义 栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表. 栈顶:栈的表尾端 栈底:栈的表头端 空栈:不含元素

【数据结构】用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等)

//[数据结构]用C++编写栈及基本操作(包括入栈,出栈,获得栈顶,摧毁,清空等等) //头文件 #ifndef _SEQ_STACK_ #define _SEQ_STACK_ #include <iostream> using namespace std; template <class Type> class SeqStack { public: SeqStack(size_t sz=INIT_SIZE) { capacity = sz > INIT_SIZE ? sz

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

【数据结构之栈】十进制转其他进制--栈基本操作

最近新学习到了栈,对于栈的理解比较浅显,这里说一下栈的基本操作,用了进制转换的例子: 以十进制为例子,例如:(1348)10=(2504)8 运算过程:N              N div 8         N mod 8 1348         168              4 168           21                0 21             2                 5 2               0                

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看