Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法使用堆栈分隔表达式_C_Stack - Fatal编程技术网

C 无法使用堆栈分隔表达式

C 无法使用堆栈分隔表达式,c,stack,C,Stack,我想得到帮助来解决我的问题。 我有一个作为char序列的表达式,我想用stack把它分开,我把这个表达式拆分成每个操作数和操作符,每个操作数和操作符都是序列,我想把它推到stack中。问题是,当我尝试在分离后打印表达式时,只有运算符显示正确,但操作数不正确。它们仅显示与顶部元素相同的操作数值。我不知道为什么,这是我的代码,请帮我检查一下。非常感谢你 #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include "strin

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

#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");
}
#包括“stdio.h”
#包括“stdlib.h”
#包括“malloc.h”
#包括“string.h”
#定义大小100
typedef结构堆栈{
int top;
字符*数据[9];
}堆叠;
void init(堆栈*s){
s->top=0;
}
无效推送(堆栈*s,字符*value){
如果(s->顶部<尺寸)
s->data[s->top++]=值;
其他的
printf(“堆栈已满”);
}
布尔isDigit(字符s){

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

问题在于这一行

push(exp,temp);
您正在堆栈上推送局部变量temp,然后将该数组重新用于下一个值。堆栈将指向同一个值,即最后一个值。例如,11+22+33将仅存储33

相反,也要用malloc分配
temp


旁注:使用ctype.h中的
isdigit()
,而不是您自己的。

欢迎使用Stack Overflow。请尽快阅读本页。使用
#包括带有尖括号的
等,而不是标准标题的双引号(由系统提供的标题,而不是您编写的标题)。不要使用
#include
–而是使用
#include
标题仅在您想要检测内存分配代码的行为并且您链接到
-lmalloc
以收集内存分配代码的可控版本时才相关。