-3

我需要创建一个堆栈,该堆栈具有一个弹出函数,可将元素从堆栈中弹出。它需要用 C 语言编写并包含两个浮点变量(float1、float2)。我不知道该怎么做,有人可以帮忙。

4

3 回答 3

2

如果您需要帮助,我能提供的最好的方法就是向您提问。为了编写弹出操作,我们需要先进行推送操作。我对吗?否则,你怎么会弹出一些东西?您需要将 2 个浮点数推入此结构,对吗?如果我告诉你编写一个保存 2 个浮点数的推送函数,你会如何编写这样的函数?

于 2013-09-25T01:58:48.737 回答
1

使用 std::stack。这是文档

于 2013-09-25T01:48:35.863 回答
0

如果您用 c 编写,则有一种通用的编程方法。下面是一个示例:head

typedef void *ElementAddr;
typedef void (*PfCbFree)(ElementAddr);

typedef struct StackRecord
{
        ElementAddr *array;
        int     elemsize;
        int     loglength;
        int     alloclength;
        PfCbFree    freefn;
} *Stack;
/* Create a new stack */
Stack stack_create(int elemsize, PfCbFree freefn);

/* Dispose the stack */
void stack_dispose(Stack stk);

/* Make the given stack empty */
void stack_make_empty(Stack stk);

/* Return true if the stack is empty */
int stack_is_empty(Stack stk);

/* Insert a new element onto stack */
void stack_push(Stack stk, ElementAddr elemaddr);

/* Delete the top element off the stack */
void stack_pop(Stack stk);

/* Fetch the top element from the stack */
void stack_top(Stack stk, ElementAddr elemaddr);

/* Fetch & Delete the top element from the stack */
void stack_top_and_pop(Stack stk, ElementAddr elemaddr);

.cpp

#define MIN_STACK_SIZE (4)

/* Create a new stack */
Stack 
stack_create(int elemsize, PfCbFree freefn)
{
        Stack stk;

        stk = malloc(sizeof(struct StackRecord));

        if ( stk == NULL) {
                fprintf(stderr, "Out of memory\n");
                exit(1);
        }

        stk->array = malloc(elemsize * MIN_STACK_SIZE);
        if (stk->array == NULL) {
                fprintf(stderr, "Out of memory\n");
                exit(1);
        }
        stk->elemsize = elemsize;
        stk->loglength = 0; 
        stk->alloclength = MIN_STACK_SIZE;
}

/* Dispose the stack*/
void 
stack_dispose(Stack stk)
{
        stack_make_empty(stk);
        free(stk->array);
        free(stk);
}

/* Make the given stack empty*/
void 
stack_make_empty(Stack stk)
{
        if ( stk->freefn ) {
                int i;
                for ( i = 0; i < stk->loglength; ++i) {
                        stk->freefn((char *)stk->array + 
                                    i * stk->elemsize);
                }
        }
        stk->loglength = 0;
}

/* Return true if the stack is empty*/
int 
stack_is_empty(Stack stk)
{
        return stk->loglength == 0;
}

static void 
stack_grow(Stack stk)
{
        stk->alloclength *= 2;
        stk->array = realloc(stk->array, 
                             stk->alloclength * stk->elemsize);
}

/* Insert a new element onto stack */
void 
stack_push(Stack stk, ElementAddr elemaddr)
{
        ElementAddr target;
        if ( stk->loglength == stk->alloclength )
                stack_grow(stk);
        target = (char *)stk->array + stk->loglength * stk->elemsize;
        memcpy(target, elemaddr, stk->elemsize);
        stk->loglength++;   
}

/* Delete the top element off the stack */
void 
stack_pop(Stack stk)
{
        ElementAddr target;
        if ( stack_is_empty(stk) ) {
                fprintf(stderr, "Empty stack\n");
                exit(1);
        }
        if ( stk->freefn ) {
                target = (char *)stk->array + 
                         (stk->loglength-1) * stk->elemsize;
        stk->freefn(target);
        }
        stk->loglength--;
}

/* Fetch the top element from the stack */
void 
stack_top(Stack stk, ElementAddr elemaddr)
{
        void *target = (char *)stk->array + 
                       (stk->loglength-1) * stk->elemsize;
        memcpy(elemaddr, target, stk->elemsize);
}

/* Fetch & Delete the top element from the stack */
void 
stack_top_and_pop(Stack stk, ElementAddr elemaddr)
{
        ElementAddr target;
        if ( stack_is_empty(stk) ) {
                fprintf(stderr, "Empty stack\n");
                exit(1);
        }
        target = (char *)stk->array + 
                 (stk->loglength-1) * stk->elemsize;
        memcpy(elemaddr, target, stk->elemsize);
        stk->loglength--;
}

您可以将它用于任何数据类型。这是一个测试代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic-stack.h"

void strfreefn(ElementAddr elemaddr)
{
        free(*(char **)elemaddr);
}

int 
main(int argc, char **argv)
{
        Stack int_stk, str_stk;
        int i;
        char *names[] = { 
                "C", "C++", "Jave", "C#", "Python", 
                "PHP", "Basic", "Objective C", "Matlab", "Golang" 
        };

        /* test integer stack */
        printf("Test integer stack\n");
        int_stk = stack_create(sizeof(int), NULL);
        for ( i = 0; i < 10; ++i ) {
                stack_push(int_stk, &i);
        }

        while ( !stack_is_empty(int_stk) ) {
                int val;
                stack_top_and_pop(int_stk, &val);
                printf("%d\n", val);
        }

        stack_dispose(int_stk);

        /* test string stack */
        printf("Test string stack\n");
        str_stk = stack_create(sizeof(char *), strfreefn);
        for ( i = 0; i < 10; ++i ) {
                char *copy = strdup(names[i]);
                char *dest;
                stack_push(str_stk, ©);
        }

        while ( !stack_is_empty(str_stk) ) {
                char *dest;
                stack_top_and_pop(str_stk, &dest);
                printf("%s\n", dest);
                free(dest);
        }
        stack_dispose(str_stk);

        return 0;
}
于 2013-09-25T02:51:21.343 回答