C语言栈的实现

    作者:朱克锋

    在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out)
在这里不仅仅是实现了栈,我想通过这个栈体现组合意义
首先看一下前面我写的链表,看一下代码的实现,然后再来看这个栈的实现,会发现组合的威力是多么的巨大

和前面一样先定义结构:
typedef struct _Stack
{
    DList *dlist;
}Stack;

下面定义基本操作,包括:
Stack *stack_create();
Ret stack_push(Stack *stack, void *data);
Ret stack_pop(Stack *stack);
int stack_len(Stack *stack);
void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx);
Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index);

完整头文件如下
#ifndef STACK_H
#define STACK_H
/*
* File:   queue.h
*/


#include "dlist.h"

typedef struct _Stack
{
    DList *dlist;
}Stack;

Stack *stack_create();
Ret stack_push(Stack *stack, void *data);
Ret stack_pop(Stack *stack);
int stack_len(Stack *stack);
void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx);
Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index);

#endif /*STACK_H*/

以下是函数实现部分(stack.c):

#include "stack.h"
#include <malloc.h>
/*
* File:   stack.c
*/
/*
*功能:实现一个结构体的初始化
*参数:void
*返回:结构体
*/


Stack *stack_create()
{
    Stack *stack = (Stack*)malloc(sizeof(Stack));

    if(stack !=NULL)
    {
        stack->dlist = dlist_create();
        if(stack->dlist == NULL)
        {
            free(stack);
            stack = NULL;
        }
    }

    return stack;
}

Ret stack_push(Stack *stack, void *data)
{
    return_val_if_fail(stack != NULL&&data != NULL, RET_FAULT);

     return dlist_add(stack->dlist, 0, data);
}

Ret stack_pop(Stack *stack)
{
    return_val_if_fail(stack != NULL, RET_FAULT);

    return dlist_delete(stack->dlist, 1);
}

int stack_len(Stack *stack)
{
    return_val_if_fail(stack != NULL, RET_FAULT);
   
    return dlist_len(stack->dlist);
}

void *stack_foreach(Stack *stack, VISIT_FUNC visit_func, void *ctx)
{
    return_val_if_fail(stack != NULL&&visit_func != NULL, NULL);
   
    return dlist_foreach(stack->dlist, visit_func, ctx);
}

Ret stack_destroy(Stack *stack, DES_FUNC des_func, int index)
{
    if(stack != NULL)
    {
        dlist_destroy(stack->dlist, des_func, index);
        stack->dlist = NULL;

        free(stack);
    }

    return RET_OK;
}



最后把测试也写在下面,供学习者测试(stacktest.c)


#include <assert.h>
#include <stdio.h>
#include "stack.h"
/*
* File:   stacktest.c
* /

/*

#include <assert.h>
#include <stdio.h>
#include "stack.h"

int main(int argc, char *argv[])
{
    int a = 33333;
    int i = 0;
    Stack * stack = NULL;

    stack =(Stack *)stack_create();

    for(i = 0; i < 10; i++)
    {
        stack_push(stack, &a);
    }
    stack_pop(stack);
    assert(9 == stack_len(stack));

    void *print_int(void *ctx, void *data)
    {
        printf("%d/n",*(int *)data);
       
        return NULL;
    }
    stack_foreach(stack, print_int, NULL );

    stack_destroy(stack, NULL, 0);
}

在这篇文章里我没有对代码本身进行解释,主要向表现的是组合的思想,程序本身不是太难,(要了解我前面写的通用链表)如果没有看的话请一定要看一下《C语言通用链表的实现》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中可以使用实现表达式计算。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义结构 typedef struct { int top; int capacity; int* array; } Stack; // 创建 Stack* createStack(int capacity) { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->top = -1; stack->capacity = capacity; stack->array = (int*)malloc(stack->capacity * sizeof(int)); return stack; } // 判断是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 判断是否已满 int isFull(Stack* stack) { return stack->top == stack->capacity - 1; } // 入 void push(Stack* stack, int item) { if (isFull(stack)) { printf("已满,无法入\n"); return; } stack->array[++stack->top] = item; } // 出 int pop(Stack* stack) { if (isEmpty(stack)) { printf("为空,无法出\n"); return -1; } return stack->array[stack->top--]; } // 获取顶元素 int peek(Stack* stack) { if (isEmpty(stack)) { printf("为空\n"); return -1; } return stack->array[stack->top]; } // 表达式计算函数 int evaluateExpression(char* expression) { Stack* stack = createStack(strlen(expression)); int i, operand1, operand2, result; for (i = 0; expression[i] != '#'; i++) { if (expression[i] >= '0' && expression[i] <= '9') { push(stack, expression[i] - '0'); } else { operand2 = pop(stack); operand1 = pop(stack); switch (expression[i]) { case '+': result = operand1 + operand2; break; case '-': result = operand1 - operand2; break; case '*': result = operand1 * operand2; break; case '/': result = operand1 / operand2; break; default: printf("无效的运算符\n"); return -1; } push(stack, result); } } return pop(stack); } int main() { char expression[100]; printf("请输入表达式(以#结尾):"); scanf("%s", expression); int result = evaluateExpression(expression); printf("计算结果:%d\n", result); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值