栈的基本操作(+实例)

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

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);
} 

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

猜你喜欢

转载自www.cnblogs.com/geziyu/p/9926941.html