C实现顺序栈和链式栈

来源:互联网 发布:淘宝视频教程 编辑:程序博客网 时间:2024/05/17 08:39

C实现顺序栈和链式栈

看到《剑指offer》面试题7,用两个栈实现队列这道题,所以就分别把栈和队列都实现了一下,栈和队列都有两种存储方式,一种是顺序存储,另外一种是链式存储。

         栈,有栈顶指针指向当前栈最顶的元素。顺序栈,则栈中的元素用数组保存即可;链式栈,关键是如何通过链表把栈中的元素串起来,栈顶指针top指向当前栈中的栈顶元素,有新的元素入栈时,新的元素的next指向栈顶元素,同时栈顶指针指向新的元素。

         顺序栈代码如下:

#include <stdio.h>#include <malloc.h>#define max_size 50typedef struct Stack {        int arr[max_size];        int top;}stack;stack *create(){        stack *stk = (stack *)malloc(sizeof(stack));        stk->top = -1;        return stk;}void push(stack *s, int val){        s->top ++;        s->arr[s->top] = val;}void pop(stack *s, int *val){        *val = s->arr[s->top];        s->top --;}void destroy(stack *s){        free(s);}int main(){        stack *stk;/* 定义一个指针变量,分配的内存空间大小是指针占的内存空间大小,不是指针指向的数据类型的空间 */        //stk = (stack *)malloc(sizeof(stack));        stk = create();        int a = 1, b = 2;        int c;        push(stk, a);        push(stk, b);        while (stk->top >= 0) {                int tmp = stk->top;                printf("%d\n", stk->arr[tmp]);                pop(stk, &c);        }        destroy(stk);        return 0;}

链式栈的代码:

#include <stdio.h>#include <malloc.h>typedef struct LNode {        int val;        struct LNode *next;}node;typedef struct Stack {        node *top;        int size;}stack;stack *create(){        stack *stk = (stack *)malloc(sizeof(stack));        stk->size = 0;        stk->top = NULL;        return stk;}void push(stack *s, int val){        node *p = (node *)malloc(sizeof(node));        p->val = val;        p->next = s->top;        s->top = p;        ++ s->size;}void pop(stack *s, int *val){        node *tmp = s->top;        *val = s->top->val;        s->top = s->top->next;        -- s->size;        free(tmp);}void destroy(stack *s){        if (!s->size) {                free(s);        }}int main(){        stack *stk;        //stk = (stack *)malloc(sizeof(stack));        stk = create();        int a = 1, b = 2;        int c;        push(stk, a);        push(stk, b);        while (stk->size > 0) {                printf("%d\n", stk->top->val);                pop(stk, &c);        }        destroy(stk);        return 0;}




0 0
原创粉丝点击