栈-顺序栈(顺序表示和实现)

从数据结构看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集。

抽象数据类型栈的定义:

栈(stack),是限定在表尾进行插入或删除操作的线性表,因此对栈来说表尾有其特殊的含义,称为栈顶,相应的,表头端称为栈底。不含元素的空表称为空栈。

栈--后进先出(last in first out)

栈-顺序栈-栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素


顺序栈的数据结构表示

typedef struct {
    SElemType *base; //在栈构造之前和销毁之后,base的值为NULL,栈底指针
    SElemType *top; //栈顶指针
    int stacksize; //当前已经分配的存储空间
}SqStack,*Stack;


栈的顺序表示和实现一:

//顺序栈的实现
#include <stdlib.h>
#include <stdio.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int Status;
typedef int SElemType;
//top为栈顶指针,每当增加新的元素时,加一
//base为栈底指针,当base=NULL,标识栈结构不存在
//top=base可以作为栈空的标志
typedef struct {
    SElemType *base; //在栈构造之前和销毁之后,base的值为NULL
    SElemType *top; //栈顶指针
    int stacksize; //当前已经分配的存储空间
}SqStack,*Stack;

Status init_stack(Stack s);//构造一个空栈
Status get_top(SqStack *s,SElemType *e); //若栈不为空,用e返回栈顶元素,并返回ok,否则返回ERROR
Status push(Stack s,SElemType e); //元素入栈
Status pop(SqStack *s,SElemType *e); //若栈不为空,则删除s的栈顶元素,用e返回其值,并返回ok,否则返回ERROR

int main()
{
    //栈变量的声明
    SqStack s;
    //构造一个空栈
    init_stack(&s);
    //元素入栈
    int i;
    for(i=0;i<10;i++){
        push(&s,i);
    }
    int top_e ;
    get_top(&s,&top_e);
    printf("栈顶元素是:%d\n",top_e);
    int pop_e;
    pop(&s,&pop_e);
    printf("出栈的元素:%d\n",pop_e);
    int n;
    get_top(&s,&n);
    printf("栈顶元素是:%d\n",n);
    return 0;
}

Status init_stack(SqStack *s){
    printf("aaaaaaaa");
    //构造一个空栈s
    //malloc分配内存空间,返回指针
    s->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    printf("\n______");
    if(!s->base){
        exit(OVERFLOW);
    }
    s->top=s->base;
    s->stacksize = STACK_INIT_SIZE;
    return OK;
}//构造一个空栈

//若栈不为空,用e返回栈顶元素,并返回ok,否则返回ERROR
Status get_top(SqStack *s,SElemType *e){
    if(s->base==s->top){
        return ERROR;
    }
    *e = *(s->top-1);
    return OK;
}

Status push(Stack s,SElemType e){
    if(s->top - s->base >= s->stacksize){//栈满,追加存储空间
        s->base = (SElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!s->base){
            exit(OVERFLOW);
        }
        s->top = s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    //元素入栈,设置栈顶元素,同时栈顶指针加一
    *(s->top)= e;
    ++s->top;
    return OK;
}

Status pop(SqStack *s,SElemType *e){
    //若栈不空,则删除s的栈顶元素,用e返回其值,并返回
    if(s->top==s->base){
        return ERROR;
    }
    --s->top;
    *e = *(s->top);
    return OK;
}

栈的顺序表示和实现二:

#include <stdio.h>
#include <stdlib.h>
//================栈的顺序存储================
#define STACK_INIT_SIZE 10 //栈初始化空间
#define STACKINCREMENT 5   //申请栈增加的时候的容量


typedef int SElemType; //定义SElemType的类型是int型
typedef struct{
    SElemType *base;//栈底
    SElemType *top; //栈顶
    int stacksize;  //栈的大小
}SqStack;

//===============初始化栈道
void InitStack(SqStack *S)
{
    S->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S->base){
       printf("malloc error\n");
       exit(1);
    }else{
       printf("malloc success\n");
    }
    S->top=S->base;
    S->stacksize = STACK_INIT_SIZE;
}

//=================Push功能: S为栈的指针 ,e为送进栈道的数
void 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){
            printf("realloc error\n");
            exit(1);
       }else {
            printf("realloc success\n");
       }
       S->top = S->base + S->stacksize;
       S->stacksize=+STACKINCREMENT;
    }
    *S->top++ = e;
}

//===============Pop:送进栈道,s为栈道,e为送出的数的地址
int Pop(SqStack *S,int *e)
{
    if(S->base == S->top){
        printf("empty\n");
        exit(1);
    }
    S->top--;
    *e = *S->top;
    return 0;
}


int main()
{
    SqStack S;
    int i,data,a,n;
    InitStack(&S); //初始化栈道
    printf("input data\n");
    scanf("%d",&data);
    while(data!=0)
    {
       Push(&S,data);
       scanf("%d",&data);
    }
    printf("output n\n"); //需要弹出多少个数
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        Pop(&S,&a);
        printf("%d\n",a);
    }
    return 0;
}




你可能感兴趣的:(栈-顺序栈(顺序表示和实现))