栈的定义以及基本运算

栈和队列实质上是俩种受限制的线性表

一 栈的定义:

 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。

二 栈的顺序存储结构

实质上是运算受限的线性表

(1)顺序栈的类型定义

[cpp] view plain copy

  1. #define StackSize 100//假定预先分配100元素  
  2. typedef char DataType;//假定栈元素的数据类型为字符  
  3. typedef struct   
  4. {  
  5.     DataType data[StackSize];  
  6.     int top;  
  7. }SeqStack;  
  8.   
  9. 注:top用来指示当前栈顶的位置,因为在栈低是不变的  
  10. 三 顺序栈的基本操作  
  11. 规定: S是SeqStack类型指针,s->data[0]为栈底元素  
  12. (1)进栈操作  
  13. 进栈时,需要将S->top加1  
  14.   ①S->top==StackSize-1表示栈满  
  15.   ②"上溢"现象--当栈满时,再做进栈运算产生空间溢出的现象。  
  16. (2)出栈操作  
  17.  退栈时,需将S->top减1  
  18.   ①S->top<0表示空栈  
  19.   ②"下溢"现象——当栈空时,做退栈运算产生的溢出现象。  
  20.  置栈空  
  21.   void InitStack(SeqStack *S)  
  22.     {//将顺序栈置空  
  23.         S->top=-1;  
  24.     }   
  25.   
  26. 判栈空  
  27.   int StackEmpty(SeqStack *S)  
  28.     {  
  29.         return S->top==-1;  
  30.     }  
  31.   
  32. 判栈满  
  33.   int StackFull(SeqStack *S)  
  34.      {  
  35.        return S->top==StackSize-1;  
  36.      }  
  37.  进栈  
  38.   void Push(SeqStack *S,int x)  
  39.      {  
  40.        if (StackFull(S))  
  41.              printf("Stack overflow"); //上溢,退出运行  
  42.        S->data[++S->top]=x;//栈顶指针加1后将x入栈  
  43.      }  
  44.   
  45.  退栈  
  46.   DataType Pop(SeqStack *S)  
  47.     {  
  48.       if(StackEmpty(S))  
  49.         {  
  50.              printf("Stack underflow"); //下溢,退出运行  
  51.              exit(0);  
  52.         }  
  53.             
  54.       return S->data[S->top--];//栈顶元素返回后将栈顶指针减1  
  55.     }  
  56.   
  57. 取栈顶元素  
  58.   DataType StackTop(SeqStack *S)  
  59.     {  
  60.        if(StackEmpty(S))  
  61.            {  
  62.              printf("Stack is empty");   
  63.              exit(0);  
  64.            }   
  65.        return S->data[S->top];  
  66.      }  

转载:http://blog.csdn.net/xsf50717/article/details/39934051

时间: 2024-09-13 07:41:37

栈的定义以及基本运算的相关文章

c++-数据结构 栈的定义 栈的定义

问题描述 数据结构 栈的定义 栈的定义 定义:栈是限定仅在表头进行插入和删除操作的线性表. 栈定义用的是数组 那为什么只能在头插入和删除 实际上到底什么啊 解决方案 只能在栈顶操作只是栈的定义要求是这样的,这样就实现了"先进后出"的效果.你应该发现普通链表.栈.队列这三种结构本质是相同的,只是人为规定只能在一端或者两端操作. 你如果直接对栈底进行操作,当然是可以的,只是这种数据结构已经不能称之为"栈"了. 如果从编程角度来说的话,假设栈是一个类,那么这个类只提供了p

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明:     往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能   关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名   

数据结构实践项目——栈

本组项目针对<数据结构基础系列(3):栈和队列>中的1-6课: 1 "栈和队列"导学 2 栈的定义 3 栈的顺序存储结构及其基本运算实现 4 栈的链式存储结构及其基本运算的实现 5 栈的应用1-表达式求值 6 栈的应用2-迷宫问题 [项目1 - 建立顺序栈算法库] 定义顺序栈存储结构,实现其基本运算,并完成测试. 要求: 1.头文件sqstack.h中定义数据结构并声明用于完成基本运算的函数.对应基本运算的函数包括: void InitStack(SqStack *&

Java栈的实例-数组和链表两种方法(转)

一.栈 栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶 (Top),另一端称为栈底 (Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表. 栈的修改是按后进先出的原则进行.每次删除(退栈)的总是当前栈中" 最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部, 要到最后才能删除.  2.栈的基本运算  (1) 判断栈是否

数据结构之自建算法库——顺序栈

本文针对数据结构基础系列网络课程(3):栈和队列中第3课时栈的顺序存储结构及其基本运算实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 顺序栈算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:sqstack.h,包含定义顺序栈数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef SQSTACK_H_INCLUDED #define SQSTACK_H_INCLUDED #define MaxSize 100 typedef

数据结构之自建算法库——链栈

本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其基本运算实现. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 链栈算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:listack.h,包含定义链栈数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef LISTACK_H_INCLUDED #define LISTACK_H_INCLUDED typedef char ElemType; typede

Java中的堆内存与栈内存分配浅析

Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对 象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量 分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以 立即被另作它用. 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来 管理.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量

数据结构教程 第十课 栈的表示与实现

本课主题: 栈的表示与实现 教学目的: 栈的数据类型定义.栈的顺序存储表示与实现 教学重点: 栈的顺序存储表示与实现方法 教学难点: 栈的定义 授课内容: 一.栈的定义 栈是限定仅在表尾进行插入或删除操作的线性表. 栈的表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈. 栈的抽象数据类型定义: ADT Stack{ 数据对象:D={ai|ai(- ElemSet,i=1,2,...,n,n>=0} 数据关系:R1={<ai-1,ai>|ai-1,ai(- D,i=2,...,n} 基本

数据结构学习(C++)之栈和队列

栈和队列是操作受限的线性表,好像每本讲数据结构的数都是这么说的.有些书按照这个思路给出了定义和实现:但是很遗憾,本文没有这样做,所以,有些书中的做法是重复建设,这或许可以用不是一个人写的这样的理由来开脱. 顺序表示的栈和队列,必须预先分配空间,并且空间大小受限,使用起来限制比较多.而且,由于限定存取位置,顺序表示的随机存取的优点就没有了,所以,链式结构应该是首选. 栈的定义和实现 #ifndef Stack_H #define Stack_H #include "List.h" tem