栈的基本操作及实现

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

typedef int ElementType;
//定义结点
typedef struct LinkNode{
    ElementType data;
    struct LinkNode* next;
} *StackNode, *QueueNode;
//定义栈
typedef struct {
    LinkNode *top;
} LinkStack;

//初始化栈
LinkStack* InitStack(LinkStack *L){
    printf("初始化栈\n");
    L = (LinkStack*)malloc(sizeof(LinkStack));
    L->top = (LinkNode*)malloc(sizeof(LinkNode));
    L->top->next = NULL;
    return L;
}

//判断栈是否为空
bool isStackEmpty(LinkStack* L){
    printf("判断栈是否为空\n");
    if (L->top->next == NULL) return true;
    else return false;
}

//入栈
StackNode Push(LinkNode *head, ElementType data){
    //首先判断栈是否已满,但这里是链栈,则不做是否已满的判断
    //我们在这个子方法里面新建一个节点,判断这个节点是否能被分配空间
    StackNode S = (StackNode)malloc(sizeof(LinkNode));
    if (S == NULL){
        printf("没有多余的空间可以分配\n");
        exit(0);
    }
    S->data = data;
    printf("S->data=%d, data=%d\n", S->data, data);
    S->next = head->next;
    head->next = S;
    printf("head->next->data=%d\n", head->next->data);
    return head;
}

//出栈,返回要出栈的元素
ElementType Pop(LinkNode* head){
    printf("进行一次pop,");
    ElementType data;
    //首先判断栈是否为空
    if (head->next == NULL){
        printf("栈为空,无法出栈\n");getchar();getchar();exit(0);
    }
    data = head->next->data;
    LinkNode* node = head->next;
    head->next = node->next;
    free(node);
    //printf("栈顶元素现在是:%d\n", head->next->data);
    return data;
}
//返回栈顶元素
ElementType GetTop(LinkNode* head){
    if (head->next == NULL)
        printf("栈为空,无法输出元素\n");
    ElementType data = head->next->data;
    printf("栈顶元素为:%d\n", data);
}

// int main(void)
// {
//     LinkStack* Stack;
//     Stack = InitStack(Stack);
//     if (isStackEmpty(Stack) == true){
//         printf("栈为空,继续进行程序\n");
//     }
//     Stack->top = Push(Stack->top, 5);
//     printf("Stack->top->data=%d\n", Stack->top->data);
//     GetTop(Stack->top);

//     //printf("%d ", Pop(Stack->top));

//     Stack->top = Push(Stack->top, 3);

//     GetTop(Stack->top);
//     Stack->top = Push(Stack->top, 1);

//     GetTop(Stack->top);
//     Stack->top = Push(Stack->top, 7);

//     GetTop(Stack->top);
//     printf("出栈的元素是:%d\n", Pop(Stack->top));
//     printf("出栈的元素是:%d\n", Pop(Stack->top));
//     printf("出栈的元素是:%d\n", Pop(Stack->top));
//     Stack->top = Push(Stack->top, 2);

//     GetTop(Stack->top);

//     getchar();
//     getchar();
//     return 0;
// }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值