作者: 拉布拉熊 | 来源:发表于2020-04-11 20:37 被阅读0次

1.栈的结构

2.栈的特点

1.先进后出;2.只能在栈顶压栈和出栈;3.top永远指向栈顶元素。

3.栈的顺序实现

(1)数据准备

#define OK1

#define ERROR0

#define TRUE1

#define FALSE0

#define MAXSIZE20/* 存储空间初始分配量 */

typedef int Status;

typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

//顺序栈结构

typedef struct{

    SElemTypedata[MAXSIZE];

    inttop;//用于栈顶指针

}SqStack;

(2)初始化

//初始化

Status InitStack(SqStack *s){

    s->top= -1;

    returnOK;

}

(3)将栈置空

Status ClearStack(SqStack *s){

    s->top= -1;

    returnOK;

}

(4)判断栈是否为空

Status StackEmpty(SqStack s){

    if(s.top== -1) {

        returntrue;

    }else{

        return false;

    }

}

(5)返回栈的长度

Status StackLength(SqStack s){

    returns.top+1;

}

(6)获取栈顶


Status GetTop(SqStack s,SElemType *e){

    if(s.top==-1) {

        returnERROR;

    }else{

        *e = s.data[s.top];

    }

    returnOK;

}

(7)压栈

Status PushData(SqStack *s,SElemType e){

    if(s->top==MAXSIZE-1) {

        //栈已满

        returnERROR;

    }else{

        //栈顶+1

        s->top++;

        s->data[s->top] = e;

    }

    returnOK;

}

(8)出栈

Status PopData(SqStack *s,SElemType *e){

    if(s->top== -1) {

        returnERROR;

    }else{

        //栈顶-1

        *e = s->data[s->top];

        s->top--;

    }

    returnOK;

}

(9)栈遍历

Status StackTraverse(SqStack s){

    inti=0;

    printf("此栈中所有元素\n");

    while(i<=s.top) {

        printf("%d ",s.data[i]);

        i++;

    }

    printf("\n");

    returnOK;

}

(10)顺序栈的调试

intmain(intargc,constchar* argv[]) {

    SqStacks;

    SElemType  e;

    InitStack(&s);

    for(inti=0; i<10; i++) {

        PushData(&s, i);

    }

    StackTraverse(s);

    GetTop(s, &e);

    printf("栈顶元素:%d \n栈长度:%d\n",e,StackLength(s));

    //

    PopData(&s, &e);

    printf("弹出栈顶元素:%d\n",e);

    StackTraverse(s);

    ClearStack(&s);

    StackTraverse(s);

    return0;

}

4.栈的链式实现

(1)数据准备

#define OK1

#define ERROR0

#define TRUE1

#define FALSE0

#define MAXSIZE20/* 存储空间初始分配量 */

typedef int Status;

typedef int SElemType; /* SElemType类型根据实际情况而定,这里假设为int */

//单向链表

typedef struct StackNode{

    SElemTypedata;

    structStackNode*next;

}StackNode, *LinkStackPtr;

//

typedef struct{

    LinkStackPtr top;//栈顶指针

    intcount;//元素个数

}LinkStack;

(2)构造一个空栈


Status InitStack(LinkStack *s){

    s->top=NULL;

    s->count=0;

    returnOK;

}

(3)栈遍历


void StackTraverse(LinkStack s){

    LinkStackPtr p = s.top;

    printf("栈中的元素为:");

    while(p) {

        printf("%d ",p->data);

        p = p->next;

    }

    printf("\n");

}

(4)压栈:插入元素


Status Push(LinkStack *s,SElemType e){

    //创建一个新结点

    LinkStackPtr temp = (LinkStackPtr)malloc(sizeof(StackNode));

    temp->data= e;

    temp->next= s->top;

    s->top= temp;

    s->count++;

    returnOK;

}

(5)出栈


Status Pop(LinkStack *s,SElemType *e){

    if(s->count==0) {

        returnERROR;

    }

    *e = s->top->data;

    //

    LinkStackPtr p = s->top;

    s->top= p->next;

    free(p);

    s->count--;

    returnOK;

}

(6)获取栈顶元素


Status GetTop(LinkStack s,SElemType *e){

    if(s.top==NULL) {

        returnERROR;

    }else{

        *e = s.top->data;

    }

    returnOK;

}

(7)清空栈


Status ClearStack(LinkStack *s){

    LinkStackPtr p,q;

    p = s->top;

    while(p) {

        q = p;

        p = p->next;

        free(q);

    }

    s->top= p;

    s->count=0;

    returnOK;

}

(8)斐波拉契数列

intFbi(inti){

    if(i<2) {

        returni==0?0:1;

    }

    returnFbi(i-1) +Fbi(i-2);

}

(9)链式栈的调试

intmain(intargc,constchar* argv[]) {

    LinkStack s;

    InitStack(&s);

    inte;

    for(inti=0; i<10; i++) {

        Push(&s, i);

    }

    StackTraverse(s);

    GetTop(s, &e);

    printf("栈顶元素为:%d\n",e);

    //

    Pop(&s, &e);

    printf("弹出的栈顶元素:%d\n",e);

    StackTraverse(s);

    //

    ClearStack(&s);

    StackTraverse(s);

    //

    printf("斐波拉契数列!\n");

    for(inti=0; i<10; i++) {

        printf("%d ",Fbi(i));

    }

    printf("\n");

    return0;

}

相关文章

  • Java实现栈

    数组栈:压栈、出栈、返回栈顶元素 链式栈:压栈、出栈、返回栈顶元素

  • 数据结构之 栈

    栈结构 链式栈 一.栈结构体 1构建空栈 2栈置空 3判断栈空 4获取栈顶 5入栈 6出栈 7便利栈 二.链式栈 ...

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 递归累加数组

    入栈 5入栈 4入栈 3入栈 2入栈 1出栈 [1 0]出栈 [2 1 0]出栈 [3 2 1 0]出栈 [4 3...

  • 栈的逻辑结构和存储结构

    main()进栈s(1)进栈s(0)进栈 s(0)出栈s(1)出栈main()出栈 顺序栈 一个数组 + 指向栈顶...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

  • 链栈的操作

    链栈的定义 链栈的操作 初始化 判断栈空 入栈 出栈

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 栈的简单Java实现

    栈栈的特点是先进后出,出栈、入栈都是在栈顶操作。

  • 汇编学习-入栈和出栈

    栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/uklpmhtx.html