堆和栈

Posted qzdd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆和栈相关的知识,希望对你有一定的参考价值。

堆和栈

Stack(栈)

栈的结构:

下面是数据结构的集中类型:

struct stu   //链表
{
    int data;  //抽象出的一种数据

    struct stu *pnext;   //链表的指针
};

struct    //顺序表
{
    int data[100];

    int size;    //顺序表大小标志
};

struct  //顺序结构的栈
{
    int data[100];

    int top;    //栈顶标志
};

顺序结构的栈:


#include <stdio.h>

#define MAXSIZE 100

typedef struct  //顺序结构的栈
{
    int data[MAXSIZE];
    int top;    //栈顶标志

}SeqStack;

void StackInit(SeqStack *S);  //初始化
int StackPush(SeqStack *S, int data);//入栈
int StackPop(SeqStack *S,int *data);//出栈

int main()
{
    int data;
    SeqStack myStack;   //定义一个变量

    StackInit(&myStack); //初始化栈

    for (int i = 0; i < 10; i++)
    {
        StackPush(&myStack, i+1);
        printf("%d	", myStack.data[i]);
    }

    for (int i = 0; i < 10; i++)
    {
        StackPop(&myStack, &data);
        printf("%d	", data);
    }
    return 0;
}

//初始化
void StackInit(SeqStack *S)
{
    S->top = 0;
}

//入栈
int StackPush(SeqStack *S, int data)
{
    if (S->top >= MAXSIZE)  //判断栈是否满
    {
        printf("栈满!
");
        return 0;
    }
    else
    {
        S->data[S->top] = data;  //往栈顶加入数据
        S->top++;
        return 1;
    }
}

//出栈  不是要删除  而是得到
int StackPop(SeqStack *S,int *data)
{
    if (S->top <= 0)
    {
        printf("栈空
");
        return 0;
    }
    else
    {
        S->top--;
        *data = S->data[S->top];
        return 1;
    }
}

//栈顶的元素 出栈判空 入栈判满 *data = S->data[S->top-1];
// 1 2 3 4 5 6 7 8 9 10

链式结构的栈:


//链式栈
#include <stdio.h>

typedef struct node
{
    int data;   
    struct node *pnext;
}LsNode;


void StackInit(LsNode **head);//初始化
void StackPush(LsNode *head, int data);  //入栈
int StackPop(LsNode *head, int *data);  //出栈


int main()
{
    int data;
    LsNode *head;  //在主函数中定义变量的时候,系统根据变量的数据类型开辟大小。int a 4  double b 8
                   //定义指针变量的时候必须用malloc去只指定内存的大小。
    StackInit(&head);

    for (int i = 0; i < 10; i++)
    {
        StackPush(head, i + 1);
    }

    for (int i = 0; i < 10; i++)
    {
        StackPop(head, &data);
        printf("%d	", data);
    }
    return 0;
}

//初始化
void StackInit(LsNode **head)
{
    *head = (LsNode *)malloc(sizeof(LsNode));
    (*head)->pnext = NULL;  //int =NULL;
}

//入栈
void StackPush(LsNode *head,int data)
{
    LsNode *p;  //从新定义一个节点
    p = (LsNode *)malloc(sizeof(LsNode));  //为新的节点开辟空间
    //malloc 开辟一块内存 并且返回一个空指针类型,空指针类型可以强制转换为任意其他指针类型。
    p->data = data;                         //对新节点的内容填充
    p->pnext = head->pnext;                     //新节点的pnext指向NULL
    head->pnext = p;                        //新节点的地址赋给head->pnext.
}

//出栈
int StackPop(LsNode *head,int *data)
{
    LsNode *p = head->pnext;  //p指向哪里? 指向第一个元素
    if (NULL == p)
    {
        printf("栈空
");
        return 0;
    }
    else
    {
        head->pnext = p->pnext;     //让head->pnext指向下一个元素
        *data = p->data;            //得到需要的第一个元素保存在data变量中
        free(p);                    //释放p指向的内存。
        return 1;
    }
}

注意:

循环队列 队列满 头尾重合 队列的大小 size 或者num 或者count计数


Typdef struct
{
Int data[100];
Int front;
Int end;
Int count;
}

以上是关于堆和栈的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中的内存分配(堆和栈)

关于堆和栈

堆和栈

Java 中的 JVM堆和栈 -- 初步了解

堆和栈

堆和栈