数据结构与算法 - 栈(完整代码)

样例输入:

push 56
push 15
push 12
push 13
pop
end

样例输出

Stack length: 3
The stack (from top to bottom): 12  15  56

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int T; //数据元素类型
struct LNode {
    T data;
    LNode* next;
};

struct LinkStack {
    LNode* top; // 栈顶指针
    int len; // 栈的长度
};
/*创建栈*/
LinkStack* LS_Create()
{
    LinkStack* ls=(LinkStack*)malloc(sizeof(LinkStack));
    ls->top = NULL;
    ls->len = 0;
    return ls;
}
/*释放栈*/
void LS_Free(LinkStack* ls)
{
    LNode* curr = ls->top;
    while(curr) {
        LNode* next = curr->next;
        free(curr);
        curr=next;
    }
    free(ls);
}
/*将栈变为空栈*/
void LS_MakeEmpty(LinkStack* ls)
{
    LNode* curr = ls->top;
    while(curr) {
        LNode* next = curr->next;
        free(curr);
        curr=next;
    }
    ls->top = NULL;
    ls->len = 0;
}
/*判断栈是否为空*/
/*判断栈是否为空*/
bool LS_IsEmpty(LinkStack* ls)
{

    return ls->len == 0;
}
/*获取栈的长度*/
int LS_Length(LinkStack* ls)
{
    return ls->len;
}
/*将x进栈*/
void LS_Push(LinkStack* ls, T x)
{
    LNode* node=(LNode*)malloc(sizeof(LNode));
    node->data=x;
    node->next=ls->top;
    ls->top = node;
    ls->len ++;
}
/*出栈。出栈元素放入item;如果空栈,将返回false*/
bool LS_Pop(LinkStack* ls, T& item)
{
    LNode* node=ls->top;
    if (node==NULL) {
        return false;
    }
    item = node->data;
    ls->top = node->next;
    ls->len --;
    free(node);
    return true;
}
/*读栈顶元素放入item。如果空栈,将返回false*/
bool LS_Top(LinkStack* ls, T& item)
{
    LNode* node=ls->top;
    if (node==NULL) {
        return false;
    }
    item = node->data;
    return true;
}
/*从栈顶到栈底打印各结点数据*/
void LS_Print(LinkStack* ls)
{
    if (ls->len==0){ 
        printf("The stack: Empty!");
        return;
    }
    printf("The stack (from top to bottom):");
    LNode* curr=ls->top;
    while(curr) {
        printf(" %d", curr->data);
        curr=curr->next;
    }
   // printf("\n");
}
int main()
{
    LinkStack* ls=LS_Create();
    char dowhat[100];
    while(true) {
        scanf("%s", dowhat);
        if (!strcmp(dowhat,"push")) {
            T x;
            scanf("%d", &x);
            LS_Push(ls,x);
        }else if (!strcmp(dowhat,"pop")) {
            T item;
            LS_Pop(ls, item);
		}
        else {
            break;
        }
    }
    int length=LS_Length(ls);
    printf("Stack length: %d\n", length);
    LS_Print(ls);
    LS_Free(ls);
}

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值