zoukankan      html  css  js  c++  java
  • 栈的基本操作(+实例)

    栈:是限定仅在表尾进行插入或删除操作的线性表,表尾段称为栈顶,表头段称为栈底,栈有称后进先出线性表。栈有顺序栈和链栈。

    一、栈的顺序存储

    1、顺序栈的结构定义

    //顺序栈的存储结构
    typedef struct{
        ElemType *base;//栈底指针变量 
        ElemType *top;//栈顶指针变量 
        int stackSize;//当前可使用的最大容量 
    }sqStack;

    2、创建一个空栈

    //创建一个空栈
    #define STACK_INIT_SIZE 100  //存储空间初始分配量 
    #define STACKINCREMENT 10 //存储空间分配增量 
    Status InitStack(SqStack &s){
        s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
        if( !s.base )
            exit(OVERFLOW);
        s.top = s.base;
        s.stackSize = STACK_INIT_SIZE;
        return OK;
    } 

    3、元素入栈

    //元素入栈
    Status Push(SqStack &s, ElemType e){
        if( s.top-s.base >= s.stackSize ){//若栈满则追加空间 
            s.base = (ElemType *)realloc(s.base,(s.stackSize+STACKINCREAMENT)*sizeof(ElemType));
            if( !s.base )
                exit(OVERFLOW);
            s.top = s.base+s.stackSize; //设置栈顶
            s.stackSize = s.stackSize+STACKINCERMENT; //设置栈的最大容量 
        }
        *s.top = e;
        s.top++; 
        //*s.top++ = e;
    }

    4、元素出栈

    //元素出栈 
    Status Pop(SqStack &s, ElemType &e){
        //若栈不为空,则用e返回s的栈顶元素
        if( s.top == s.base )
            return ERROR;
        e = *--s.top;  //s.top指针先向下移动一个位置,再取出其中的元素
        return OK; 
    } 

    5、清空一个栈(将栈顶指针指向栈底指针)

    //清空一个栈
    Status ClearStack(SqStack &s){
        s.top = s.base; //栈顶指针指向栈底指针
        return OK; 
    } 

    6、销毁一个栈

    //销毁栈
    Status DestroyStack(SqStack &s){
        int len = s.stackSize;
        for(int i =0; i < len; i++){
            free(s.base);
            s.base++;
        }
        s.base = s.top = NULL;
        s,stackSize = 0;
    } 

    7、返回栈的当前容量

    //返回栈当前容量
    Status StackLen(SqStack &s){
        return (s.yop-s.base);
    } 

    栈的应用(进制间的转换):

     1 //二进制转十进制
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<math.h>
     5 
     6 #define STACK_INIT_SIZE 20
     7 #define STACKINCREMENT 10
     8 
     9 typedef char ElemType;
    10 
    11 typedef struct{
    12     ElemType *base;
    13     ElemType *top;
    14     int stackSize;
    15 }sqStack;
    16 
    17 void InitStack(sqStack &s){
    18     s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
    19     if( !s.base )
    20         exit(0);
    21     s.top = s.base;
    22     s.stackSize = STACK_INIT_SIZE;
    23 }
    24 
    25 void Push(sqStack &s, ElemType e){
    26     if( s.top-s.base >= s.stackSize ){
    27         s.base = (ElemType *)realloc(s.base, (s.stackSize+STACKINCREMENT)*sizeof(ElemType));
    28         if( !s.base )
    29             exit(0);
    30     }
    31     *s.top = e;
    32     s.top++;
    33 }
    34 
    35 void Pop(sqStack &s, ElemType &e){
    36     if( s.top == s.base )
    37         return ;
    38     e = *--s.top;
    39 }
    40 
    41 int StackLen(sqStack s){
    42     return (s.top-s.base);
    43 } 
    44 
    45 int main(){
    46     ElemType c;
    47     int len,sum = 0;
    48     sqStack s;
    49     InitStack(s);
    50     printf("请输入一个二进制数,输入#表示结束!
    ");
    51     scanf("%c",&c);
    52     while( c != '#' ){
    53         Push(s,c);
    54         scanf("%c",&c);
    55     }
    56     getchar();
    57     len = StackLen(s);
    58     printf("栈的当前容量是:%d
    ",len);
    59     for(int i = 0; i <len; i++){
    60         Pop(s,c);
    61         sum = sum+(c-48)*pow(2,i);
    62     }
    63     printf("转化为十进制数为:%d
    ",sum);
    64     return 0; 
    65 } 

     

  • 相关阅读:
    剑指 Offer 26. 树的子结构
    99. 恢复二叉搜索树(困难)
    93. 复原IP地址
    剑指 Offer 20. 表示数值的字符串
    100. 相同的树
    336. 回文对
    12. 整数转罗马数字(贪心!)
    块链技术在数据中心应用的成与败
    新型大脑启发式学习方法来了,可帮助人工神经网络节省内存和能量
    混合多云为何具有技术优势
  • 原文地址:https://www.cnblogs.com/geziyu/p/9926941.html
Copyright © 2011-2022 走看看