-3

スタックから要素をポップする pop 関数を持つ Stack を作成する必要があります。C で記述し、2 つの float 変数 (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 で書く場合は、一般的なプログラミング方法があります。以下にサンプルを示します。

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 に答える