-seventy-
Welcome to my blog space.

认识栈

/*
    栈的定义:
    ---栈是一种只能从表的一端存储数据,且遵循“先进后出”原则的"线性存储结构"
        1.栈只能从一端(栈顶)取出,另一端(栈底)是封闭的
        2.在栈中,都必须从“栈顶”存储数据,且遵循“先进后出”原则

    
    入栈和出栈:
        1.入栈:将数据存到栈里面去 
        2.出栈:将数据从站里面取出来


    栈的实现方法:
    ---栈:“特殊”的线性存储结构
        1.顺序表:顺序栈(顺序存储结构)
        2.链  表:链  栈(链式存储结构)

*/

实现顺序栈

# include <stdio.h>

/* 1.元素入栈 */
// 参  数:存储结构,栈顶 top,数据 value
// 返回值: top
int putEle(int* arr, int top, int value)
{
    arr[++top] = value;
    return top;
}

/* 2.元素入栈 */
// 参  数:存储结构,栈顶 top
// 返回值: top
int takeEle(int* arr, int top)
{
    // 先判断
    if (top <= -1)
    {
        printf("操作失败!空栈!\n");
        return -1;
    }
    printf("当前出栈元素的值:%d\n", arr[top]);
    top--;
    return top;
}

int main()
{
    // 顺序表:为了理解简单化,我们使用列表
    int a[100];

    // top (记录栈顶)
    int top = -1;

    // 入栈(入5个)
    top = putEle(a, top, 1);
    top = putEle(a, top, 2);
    top = putEle(a, top, 3);
    top = putEle(a, top, 4);
    top = putEle(a, top, 5);

    // 出栈(出6个)
    top = takeEle(a, top);
    top = takeEle(a, top);
    top = takeEle(a, top);
    top = takeEle(a, top);
    top = takeEle(a, top);
    top = takeEle(a, top);

    return 0;
}

实现链栈

/*
    链栈:
        一般来说,我们将链表的“头结点”作为栈顶,“尾结点”作为栈底,这样的效率高一些(如图所示)

    注意事项:
        “头结点”是不断更新的,即“头结点”永远是“刚进来”的那个
        “尾结点”是不会更新的,即“尾结点”永远是“第一个进来”的那个

    ---如果用另外一种方式:
        头结点”作为栈底,“尾结点”作为栈顶,这种方式,每次新的元素入栈,都要从栈底遍历一遍到栈顶,才能入栈成功
        将会遍历很多次,效率非常低下
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node* pnext;

}Node;


// 入栈函数
Node* eleIn(Node* p, int num)
{
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = num;
    temp->pnext = p;
    p=temp;
    printf("当前进栈元素的值:%d\n", num);
    return p;
}


// 出栈函数
Node* eleOut(Node* p)
{
    if (p)
    {
        Node* temp = p;
        printf("当前出栈元素的值:%d\n", temp->data);
        p = temp->pnext;
        free(temp);
        temp = NULL;
    }
    else
    {
        printf("栈是空的!\n");
    }

    return p;
}



int main()
{
    Node* p = NULL;

    // 进栈(5次)
    p = eleIn(p, 1);
    p = eleIn(p, 2);
    p = eleIn(p, 3);
    p = eleIn(p, 4);
    p = eleIn(p, 5);

    printf("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");

    // 出栈(6次)
    p = eleOut(p);
    p = eleOut(p);
    p = eleOut(p);
    p = eleOut(p);
    p = eleOut(p);
    p = eleOut(p);

    return 0;
}

 

posted on 2023-07-16 12:36  -seventy-  阅读(12)  评论(0)    收藏  举报