用数组和链表实现栈

完成一个栈总共需要完成以下操作:

初始化

入栈

出栈

查看栈顶元素

查看栈的容量

清空栈。


首先是简单的,用数组做的,会有越界的可能。


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


typedef struct Stack {
    int data[100];
    int top;
} Stack;

Stack * s ;
// 生成栈
void initStack(){
    s = (Stack *)malloc(sizeof(Stack));
    s->top = -1;

}

// 入栈,push
void push(int data){

    if(s->top + 1 >= 100){
        printf("超出了栈的最大容量,入栈失败\n");
        return;
    }

    s->top ++;
    s->data[s->top] = data;

}

// 出栈,pop
void pop(){
    if (s->top == -1){

        printf("此栈已经是空栈了\n");
        return;
    }
    printf("数据 %d  即将出栈\n",s->data[s->top]);
    s->top--;
}


// 清空栈
void clearStack(){
    while (s->top >=0){
        pop();
    }
}

// 获取栈顶元素
void topItem(){
    if (s->top==-1){
        printf("此栈为空栈\n");
        return;
    }

    printf("此栈中元素数量为 %d 个,栈顶为 %d\n",s->top+1,s->data[s->top]);
}




int main()
{

    initStack();
    topItem();
    push(3);
    push(7);
    push(1);
    push(8);
    push(13);
    topItem();
    pop();
    clearStack();


   topItem();

}


用链表做的,理论上无上限,除非计算机内存都用完了。

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


typedef struct Node {
    int data;
    struct Stack * next;
} Node;

typedef struct Stack {
    Node * data;
    int count;
} Stack;

Stack * s ;
// 生成栈
void initStack(){
    s = (Stack *)malloc(sizeof(Stack));
    s->count = 0;
    s->data = NULL;
}

// 入栈,push
void push(int data){

    Node * n = malloc(sizeof(Node));
    n->data = data;
    n->next = s->data;

    s->data = n;
    s->count ++;
}

// 出栈,pop
void pop(){

    if(s->data == NULL) {
        printf("已经是空栈了");
        return;
    }

    Node * n = s->data;
    printf("数据 %d  即将出栈\n",n->data);
    s->data=n->next;
    free(n);
    s->count--;
}


// 清空栈
void clearStack(){

    while (s->data != NULL) {
         pop();
    }

}

// 获取栈顶元素
void topItem(){
    if (s->data==NULL){
        printf("此栈为空栈\n");
        return;
    }

    printf("此栈中元素数量为 %d 个,栈顶为 %d\n",s->count,s->data->data);
}




int main()
{

    initStack();
    topItem();
    push(3);
    push(7);
    push(1);
    push(8);
    push(13);
    topItem();
    pop();
    push(222);
    pop();
    clearStack();


   topItem();

}

计算机的函数调用就是采用了栈结构,还有逆波兰表达式(可以算加减乘除和括号)的算法都用到了栈结构。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值