2

我想寻求帮助来解决我的问题。我有一个作为字符序列的表达式,我想使用堆栈将它分开,我将此表达式拆分为每个操作数和运算符,它们每个都是序列,我想将它推入堆栈。问题是当我在分离后尝试打印表达式时,只有运算符正确显示,但操作数不正确。它们只显示与顶部元素相同的操作数值。我不知道为什么,这是我的代码,请帮我检查一下。非常感谢!

#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
#define SIZE 100
typedef struct Stack{
    int top;
    char *data[9];
}Stack;

void init(Stack *s){
    s->top = 0;
}
void push(Stack *s, char *value){
    if(s->top < SIZE)
        s->data[s->top++] = value;
    else
        printf("stack is full");
}

bool isDigit(char s){
    if(s>='0' && s<='9')
        return true;
    return false;
}

void separate(Stack *exp,char *s){

    char temp[9];
    int n = strlen(s);  
    int l = 0,size=0;
    for(int i = 0;i<n;i++){
        if(isDigit(s[i])){
            temp[l++]=s[i];

        }
        else{           
            if(l!=0){
                temp[l]='\0';               
                push(exp,temp);
                l=0;    
            }

            char *c= (char*)malloc(sizeof(char));
            sprintf(c,"%c",s[i]);
            push(exp,c);
        }               
    }
    temp[l]='\0';
    push(exp,temp);

}

void main(){
    Stack *s = (Stack*)malloc(sizeof(Stack));
    init(s);
    char expression[100];
    printf("Enter your expression, for exp: 2-33/134+8\n");
    gets(expression);
    separate(s,expression); 
    int size = s->top;
    printf("\nsize = %d",size);
    printf("\nElements of stack are");
    for(int i = 0;i<size;i++)
        printf("\n %s",s->data[i]);
    system("pause");
}
4

2 回答 2

1

这是因为您使用相同的内存位置temp, 来存储所有数字序列。这也是错误的,因为temp它是函数本地的,并且对指针 ( ) 的任何访问在函数&temp[0]外部都是未定义的separate。使用 malloc 和 strcpy 创建一个新字符串并将 temp 复制到其中。然后推送这个新字符串。或者,您可以使用atoi创建一个整数并推送它而不是推送一个字符串。

于 2013-08-02T04:33:52.537 回答
1

问题出在这一行

push(exp,temp);

您正在将局部变量 temp 推入堆栈,然后将相同的数组重用于下一个值。Stack 最终会指向同一个值,即最后一个值。例如 11+22+33 将只存储 33

temp而是使用 malloc分配

旁注:使用isdigit()来自 ctype.h 而不是你自己的。

于 2013-08-02T04:34:08.670 回答