顺序栈的各种基本运算

顺序栈的各种基本运算


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

  欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。下面开始正式内容

  堆栈(英語:stack)又稱為棧或堆棧,是計算機科學中一種特殊的串列形式的抽象資料型別,其特殊之處在於只能允許在鏈結串列或陣列的一端(稱為堆疊頂端指標,英語:top)進行加入數據(英語:push)和輸出數據(英語:pop)的運算。另外棧也可以用一維數組或連結串列的形式來完成。堆疊的另外一個相對的操作方式稱為佇列。
  由於堆疊資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。维基百科-堆栈


实验环境


  • 语言c/c++
  • 编译器devc++5.11/5.40


实验内容与要求


  1. 初始化顺序栈;
  2. 判断顺序栈是否为空;
  3. 依次进栈元素a,b,c,d,e;
  4. 判断顺序栈是否为空;
  5. 输出栈长度;
  6. 输出从栈顶到栈底的元素;
  7. 读出栈顶元素;
  8. 删除栈顶元素;
  9. 输出从栈顶到栈底的元素;
  10. 判断顺序栈是否为空;
  11. 释放栈。


目录


  • 顺序栈的各种基本运算
    • 实验环境
    • 实验内容与要求
  • 目录
  • 实验解析
    • 结构说明
    • 定义说明
    • 函数说明
      • 顺序栈函数
        • 初始化顺序栈
        • 判空
        • 获取长度
        • 打印
        • 入栈
        • 出栈
        • 栈顶元素
        • 释放
      • 主函数
    • 结果展示
  • 附录
    • 相关资料
    • 源代码

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创


实验解析

结构说明


  栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。利用顺序存储方式实现的栈称为顺序栈。由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现栈的顺序存储。
  在此,我们利用C语言的结构体类型定义顺序栈:

#define STACK_INIT_SIZE  100;   //栈存储空间的初始分配量
#define STACKINCREMENT  10;   //存储空间分配增量
typedef struct{
   SElemType  *base;             //存储数据元素的数组
   SElemType  *top;              //栈顶指针
   int stacksize;                   //当前分配的栈空间大小
                                 //(以sizeof(SElemType)为单位)
}SqStack;


定义说明


#define  OK  1
#define  ERROR  0
#define  TRUE  1
#define  FALSE  0
typedef  int  Status;
typedef  char SElemType;
#define STACK_INIT_SIZE  100   //栈存储空间的初始分配量
#define STACKINCREMENT  10   //存储空间分配增量

  定义常用常量,类型别称


函数说明



顺序栈函数

初始化顺序栈
Status InitList_stack (SqStack &s) {//&在这里表示引用 
    s.base = (SElemType*)malloc( STACK_INIT_SIZE*sizeof(SElemType));
    if (!s.base )   
        exit(0);
    s.stacksize = STACK_INIT_SIZE;
    s.top = s.base;
    return OK;
}// InitList_stack

  引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;引用 -百度百科

   给顺序栈s分配空间 ,成功返回1,失败则结束程序。 使用顺序栈一定要先初始化再使用


判空
Status EmptyStack (SqStack s) { 
    if(s.base == s.top)  
        return TRUE;
    else 
        return FALSE;
}

  判断顺序栈s是否为空,空返回1,不空为0


获取长度
Status GetLength(SqStack s){
    return s.top-s.base;
}

  返回顺序栈s长度


打印
Status DisplayStack(SqStack &s){
    while(s.base != s.top){ 
        printf("%c ",*--(s.top));
    }
    printf("\n");
    return OK; 
}

  打印顺序栈s中的值到屏幕


入栈
Status PushStack(SqStack &s , SElemType e ){
    if(s.stacksize<(s.top-s.base) )//溢出
        return ERROR;
    if(s.stacksize==(s.top-s.base) )
        s.base = (SElemType*)malloc(( s.stacksize+STACKINCREMENT)*sizeof(SElemType));
    *(s.top) = e;
    s.top++;
    return OK;  
}

  将元素e插入顺序栈s入栈,成功返回1,失败返回0


出栈
Status OutStack(SqStack &s , SElemType &e){
    if(s.top != s.base)
        e= *(s.top--);
    return OK;
}

   将栈顶元素出栈存入e,成功返回1,失败返回0


栈顶元素
SElemType TopStack(Stack &s ){
    SElemType   e;
    if(s.top != s.base)
        e= *(s.top-1);
    return e;
}

   获取栈顶元素并返回,不出栈。


释放
Status DestroyStack ( SqStack s) {      
    if (!s.base)  
        return ERROR; 
    free (s.base);    
    s.base = NULL;
    s.top = NULL;
    s.stacksize= 0;
    return OK;
}// DestroyList_Sq  

   释放传入的顺序栈,成功返回1,失败返回0



主函数


int main(){
    SqStack s;
    SElemType e;
    printf("1)初始化顺序栈;\n");
    InitList_stack(s);  
    printf("2)判断顺序栈是否为空;");
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("3)依次进栈元素a,b,c,d,e;\n");
    PushStack(s,'a');
    PushStack(s,'b');   
    PushStack(s,'c');
    PushStack(s,'d');
    PushStack(s,'e');
    printf("4)判断顺序栈是否为空;");
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("5)输出栈长度;");
    printf("%d\n",GetLength(s));
    printf("6)输出从栈顶到栈底的元素:");
    DisplayStack(s);
    printf("7)依次进栈元素a,b,c,d,e;\n");
    PushStack(s,'a');
    PushStack(s,'b');   
    PushStack(s,'c');
    PushStack(s,'d');
    PushStack(s,'e');
    printf("8)读出栈顶元素,删除栈顶元素;");
    OutStack(s,e);
    printf("%d\n",GetLength(s));
    printf("9)输出从栈顶到栈底的元素;");
    DisplayStack(s);
    printf("10)判断顺序栈是否为空;");    
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("11)释放栈。");
    DestroyStack(s);
}


结果展示


顺序栈的各种基本运算_第1张图片


附录

相关资料

  1. 维基百科-堆栈
  2. 百度百科 -引用


源代码


码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

#include   //EOF,NULL
#include  //malloc()
#include  //exit()

#define  OK  1
#define  ERROR  0
#define  TRUE  1
#define  FALSE  0

typedef  int  Status;
typedef  char    SElemType;
#define STACK_INIT_SIZE  100   //栈存储空间的初始分配量
#define STACKINCREMENT  10   //存储空间分配增量

typedef struct{
   SElemType  *base;             //存储数据元素的数组
   SElemType  *top;              //栈顶指针
   int stacksize;                   //当前分配的栈空间大小
                                 //(以sizeof(SElemType)为单位)
}SqStack;


Status InitList_stack (SqStack &s) {
    s.base = (SElemType*)malloc( STACK_INIT_SIZE*sizeof(SElemType));
    if (!s.base )   
        exit(0);
    s.stacksize = STACK_INIT_SIZE;
    s.top = s.base;
    return OK;
}// InitList_stack

Status EmptyStack (SqStack s) { 
    if(s.base == s.top)  
        return TRUE;
    else 
        return FALSE;
}//

Status PushStack(SqStack &s , SElemType e ){
    if(s.stacksize<(s.top-s.base) )
        return ERROR;
    if(s.stacksize==(s.top-s.base) )
        s.base = (SElemType*)malloc(( s.stacksize+STACKINCREMENT)*sizeof(SElemType));
    *(s.top) = e;
    s.top++;
    return OK;  
}

Status GetLength(SqStack s){
    return s.top-s.base;
}

Status DisplayStack(SqStack &s){
    while(s.base != s.top){ 
        printf("%c ",*--(s.top));
    }
    printf("\n");
    return OK; 
}

Status OutStack(SqStack &s , SElemType &e){
    if(s.top != s.base)
        e= *(s.top--);
    return OK;
}

SElemType TopStack(Stack &s ){
    SElemType   e;
    if(s.top != s.base)
        e= *(s.top-1);
    return e;
}

Status DestroyStack ( SqStack s) {      
    if (!s.base)  
        return ERROR; 
    free (s.base);    
    s.base = NULL;
    s.top = NULL;
    s.stacksize= 0;
    return OK;
}// DestroyList_Sq  

int main(){
    SqStack s;
    SElemType e;
    printf("1)初始化顺序栈;\n");
    InitList_stack(s);  
    printf("2)判断顺序栈是否为空;");
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("3)依次进栈元素a,b,c,d,e;\n");
    PushStack(s,'a');
    PushStack(s,'b');   
    PushStack(s,'c');
    PushStack(s,'d');
    PushStack(s,'e');
    printf("4)判断顺序栈是否为空;");
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("5)输出栈长度;");
    printf("%d\n",GetLength(s));
    printf("6)输出从栈顶到栈底的元素:");
    DisplayStack(s);
    printf("7)依次进栈元素a,b,c,d,e;\n");
    PushStack(s,'a');
    PushStack(s,'b');   
    PushStack(s,'c');
    PushStack(s,'d');
    PushStack(s,'e');
    printf("8)读出栈顶元素,删除栈顶元素;");
    OutStack(s,e);
    printf("%d\n",GetLength(s));
    printf("9)输出从栈顶到栈底的元素;");
    DisplayStack(s);
    printf("10)判断顺序栈是否为空;");    
    printf(EmptyStack(s)?"ture\n":"flase\n");
    printf("11)释放栈。");
    DestroyStack(s);
}

码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创

你可能感兴趣的:(数据结构,c-c++,计算机基础,栈,顺序栈,数据结构,c-c++,源码)