顺序栈 链栈

开始积累并且熟练常用的数据结构和算法,实践实践再实践!!!!!!


以前的不足之处在于动手太少,来到一个新的环境,新的挑战,科研要搞,论文要读,代码也一定要坚持写,坚持学习,不断提高自己,少抱怨,多脚踏实地思考实践。


虽然自己很菜,虽然项目坑爹,虽然读论文有时候很枯燥很无聊甚至以后根本用不上这些毕竟产业界还是要靠真本事吃饭而不是忽悠两下就能混下去的。


没关系,至少我还有时间呀,我还有一颗努力提高评自己的决心和毅力!!!我一定会把linux c c++ 服务端编程学好的!!!不为什么,因为我喜欢研究这个呀!


加油,静下心来,每天坚持提高,笨鸟先飞!!! 


送给自己:沉淀,积累,宁静致远




看代码没用,理解了必须手写实践!!!


顺序栈:

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

#define ElemType int

typedef struct {
    ElemType *base;
    int top;
    int length;
}Stack; 

/*
 * we keep a contract here as the same as the Linux lib
 * return value 0 is successful, either -1 means failed
 */
int init_Stack(Stack *s, int length) {
    if ((s->base = (ElemType *)malloc(length * sizeof(ElemType))) == NULL) {
        fprintf(stdout, "init stack error\n"); 
        return -1;
    }
    s->top = -1;
    s->length = length;
    return 0;
}

int empty_stack(Stack *s)
{
    if (s->top == -1)
        return 0;       //empty
    else
        return -1;      //not empty
}

int full_stack(Stack *s)
{
    if (s->top == s->length - 1)
        return 0;       //full
    else
        return -1;      //not full
}

int push_stack(Stack *s, ElemType value)
{
    if (full_stack(s) == 0)
        return -1;      //stack full, failed
    s->top++;
    s->base[s->top] = value; 
    return 0;           //successful
}

int pop_stack(Stack *s, ElemType *value)
{
    if (empty_stack(s) == 0)
        return -1;
    *value = s->base[s->top];
    s->top--;
    return 0;
}

int top_stack(Stack *s, ElemType *value)
{
    if (empty_stack(s) == 0) 
        return -1;      //faled
    *value = s->base[s->top];
    return 0;           //successful
}

void destroy_stack(Stack *s)
{
    free(s->base); 
    free(s);
}

int main(void)
{
    Stack *s;
    if ((s = (Stack *)malloc(sizeof(Stack))) == NULL) {
        fprintf(stdout, "stack obj init error\n"); 
        exit(-1);
    }
    if (init_Stack(s, 15) < 0) {
        fprintf(stdout, "init stack error\n"); 
        exit(-1);
    }
    push_stack(s, 19);
    push_stack(s, 1);
    push_stack(s, 99);

    ElemType test;
    pop_stack(s, &test);
    fprintf(stdout, "pop now is :%d\n", test);
    top_stack(s, &test); 
    fprintf(stdout, "top now is :%d\n", test);
    
    destroy_stack(s);
    return EXIT_SUCCESS;
}



链栈:


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

#define ElemType int

typedef struct STACK{
    struct STACK_NODE *head;
    size_t actual;
    size_t length;
}Stack;

typedef struct STACK_NODE{
    ElemType data;
    struct STACK_NODE *next;
}StackNode;

/*
 * confront to the Linux lib
 * return 0 means successful
 * return -1 means failed
 */
int init_stack(Stack *s, size_t length)
{
    StackNode *head = NULL;

    /* make a stack head, then make stack_node */
    if ((s = (Stack *)malloc(sizeof(Stack))) == NULL) {
        perror("init stack error\n"); 
        return -1;
    }

    /* head node */
    if ((head = (StackNode *)malloc(sizeof(StackNode))) == NULL) {
        perror("init stack head error\n"); 
        return -1;
    }
    head->data = 0;
    head->next = NULL;

    s->head = head;
    s->length = length;
    s->actual = 0;
    return 0;
}

void destroy_stack(Stack *s)
{
    StackNode *head = s->head->next;
    while (head != NULL) {
        StackNode *tmp = head->next;
        free(head);
        head = tmp;
    }
    free(s->head);
    free(s);
}

int is_empty(Stack *s)
{
    if (s->head->next == NULL) // the link has a head
        return 0;           //empty
    else
        return -1;          //not empty
}

int is_full(Stack *s)
{
    if (s->actual == s->length) 
        return 0;           //full
    else
        return -1;          //not full
}

int push_stack(Stack *s, ElemType *value)
{ 
    /* insert the node to the head */
    StackNode *tmp = NULL;
    if ((tmp = (StackNode *)malloc(sizeof(StackNode))) == NULL)
        return -1;
    tmp->data = *value;
    tmp->next = s->head->next;
    s->head->next = tmp;
    return 0; 
}

int pop_stack(Stack *s, ElemType *value)
{
    if (is_empty(s) == 0)
        return -1;
    *value = s->head->next->data;
    StackNode *tmp = s->head->next;
    s->head->next = s->head->next->next;
    free(tmp);
    return 0;
}

int top_stack(Stack *s, ElemType *value)
{
    if (is_empty(s) == 0)
        return -1;
    *value = s->head->next->data;
    return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值