【问题标题】:C — How would I make my stack completely dynamic? [duplicate]C — 如何让我的堆栈完全动态化? [复制]
【发布时间】:2015-06-11 13:07:14
【问题描述】:

目前我的代码使用堆栈并将用户输入的字符串一一推送到堆栈中。但是我想让它动态化,我会 malloc/realloc 什么,我知道我遗漏了一些完全明显的东西,但我想我有隧道视野......帮助?

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
char a [MAXSIZE];
char * p = a;
int top = -1;

void push ( char n )
{
    if ( top == 99)
    {
        printf( "stack overflow");
        return;
    }
    top+=1;
    a[top] = n;
}


/*  Function to delete an element from the stack */
void pop(){
    if(top == -1)
        printf("Stack is Empty");
    else
        top-=1;

}

char *inputString(FILE* fp, size_t size){
    //The size is extended by the input with the value of the provisional
    char *str;
    int ch;
    size_t len = 0;
    str = realloc(NULL, sizeof(char)*size);//size is start size
    if(!str)return str;
    while(EOF!=(ch=fgetc(fp)) && ch != '\n'){
        str[len++]=ch;
        if(len==size){
            str = realloc(str, sizeof(char)*(size+=16));
            if(!str)return str;
        }
    }
    str[len++]='\0';

    return realloc(str, sizeof(char)*len);
}
int balanced (char * m){
    int size = sizeof(m);
    int i, j;
    for (i=0; i<=size; ++i){
        push(m[i]);
    }
}
int main(void){
    char *m;

    printf("input string : ");
    m = inputString(stdin, 10);
    printf("%s\n", m);
    balanced(m);
    int i;
    for (i=0;i<=sizeof(a);++i){
        printf("\n%c", a[i]);
    }
    free(m);
    return 0;
}

【问题讨论】:

  • 隧道视野可能是件好事。清除所有与您的问题直接无关的无关代码。做一堆int,使用硬编码值代替用户输入,simplify。然后你可能会看到答案。或者至少减少您要求我们做的工作量。
  • 本版问题与上一版问题的唯一显着变化是for (i = 0; i &lt;= MAXSIZE; ++i) 已变为for (i = 0; i &lt;= sizeof(a); ++i)。这几乎是同一个问题被问了两次;请不要那样做!

标签: c stack malloc push realloc


【解决方案1】:

如果我正确理解你的问题,这就是你应该做的。

struct Stack
{
    char c;
    struct Stack *next;
}*stack = NULL;

char pop()
{
    if(stack == NULL)
    {
        printf("Stack Underflow\n");
        return NULL;
    }
    c = stack -> c;
    struct Stack * temp = stack;
    stack = stack -> next;
    free(temp);

    return c;
}

void push(char c)
{
    struct Stack * temp = malloc(sizeof(struct Stack));
    temp -> next = NULL;
    temp -> c = c;

    if (stack == NULL)
        stack = temp;
    else
    {
        temp -> next = stack;
        stack = temp;
    }
}

【讨论】:

  • 堆栈溢出错误消息是当堆栈在推送时超过给定大小时
  • @Ulterior,好的。我没有注意到这一点。现在刚刚更正。
  • 链表是一种选择,但我不确定它是否是单个字符堆栈的最佳选择。我认为动态分配的数组会更明智。
猜你喜欢
  • 2012-01-18
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2014-02-26
  • 2017-10-18
  • 1970-01-01
  • 2010-09-27
相关资源
最近更新 更多