c栈操作

本文介绍了一个简单的栈实现方式,包括初始化、压栈、出栈、获取栈容量、清空及销毁栈等基本操作,并通过示例代码展示了如何使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
001#include<stdio.h>
002#include<stdlib.h>
003#define STACK_SIZE 100          //栈初始大小
004#define AUTO_INCREMENT 10       //自增大小
005 
006typedef struct{
007    int *base;
008    int *top;
009    int stacksize;
010}sqStack;
011 
012/**
013 * 初始化一个栈
014 **/
015void init(sqStack *s) {
016    s->base = (int *)malloc(STACK_SIZE*sizeof(int));
017    if ( !s->base ) exit(0);
018    s->top = s->base;
019    s->stacksize = STACK_SIZE;
020}
021/**
022 * 压栈操作
023 **/
024void push(sqStack *s, int e) {
025    if ( s->top - s->base == s->stacksize ) {
026        s->base = (int *)realloc(s->base, AUTO_INCREMENT);
027        if (!s->base) exit(0);
028        s->top = s->base + s->stacksize;
029        s->stacksize += AUTO_INCREMENT;
030    }
031    *(s->top) = e;
032    s->top++;
033}
034 
035/**
036 * 出栈操作
037 **/
038int pop(sqStack *s) {
039    if ( s->top == s->base ) return -1;
040    return *(--s->top);
041}
042 
043/**
044 * 获取栈的当前容量
045 **/
046int getSize(sqStack s) {
047    return (s.top - s.base);
048}
049 
050/**
051 * 清空栈
052 **/
053void clearStack(sqStack *s) {
054    s->top = s->base;
055}
056 
057/**
058 * 销毁栈
059 **/
060void destoryStack(sqStack *s) {
061    if ( s->top == s->base ) return;
062    while ( s->top != s->base ) {
063        free(s->top);
064        s->top--;
065    }
066    free(s->top);
067    s->top = s->base = NULL;
068    s->stacksize = 0;
069}
070 
071/**
072 * 遍历栈
073 **/
074void showStack(sqStack s) {
075    if ( s.top == s.base ) return;
076    --s.top;                    //top指针是指向栈顶的上一个地址的,所以需要先减一
077    while ( s.top != s.base ) {
078        printf("%d ", *(s.top));
079        s.top--;
080    }
081    printf("%d\n", *(s.top));   //打印出最后一个元素
082}
083 
084int main() {
085    sqStack s;
086    int i,size;
087    init(&s);
088    push(&s, 3);
089    push(&s, 4);
090    push(&s, 5);
091    showStack(s);
092     
093    size = getSize(s);
094    printf("curSize:%d\n", size);
095     
096    i = pop(&s);
097    printf("%d\n", i);
098     
099    i = pop(&s);
100    printf("%d\n", i);
101     
102    i = pop(&s);
103    printf("%d\n", i);
104     
105    i = pop(&s);
106    printf("%d\n", i);
107    return 0;
108}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值