Also mache ich einen einfachen Infix-Rechner. Ich habe Probleme beim Speichern eines Char und einem Doppel auf einem Stapel.Mehrere Datentypen in einem Stapel in C
Zuerst habe ich versucht, die Operanden und Operator zu trennen, wie im Code unten zu sehen, aber später merke ich, dass ich in großen Schwierigkeiten gegangen wäre.
Ich bin ein Neuling auch in Gewerkschaften verwenden Was soll ich tun, um ein Char und ein Doppel nur auf einem Stapel zu speichern?
hier ist der Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef union{
char c;
double d;
} Union;
typedef struct Node{
Union data;
struct Node *link;
} Node;
typedef struct Stack{
Node *top;
}Stack;
void initialize_stack(Stack *stack)
{
stack->top=NULL;
}
int is_stack_empty(Stack *stack)
{
return(stack->top==NULL);
}
void push_c(Stack *stack, char x)
{
Node *node=(Node*)malloc(sizeof(Node));
if(node==NULL)
{
printf("Sorry no enough memory\n");
}
else
{
node->data.c=x;
node->link=NULL;
if(is_stack_empty(stack))
{
stack->top=node;
}
else
{
node->link=stack->top;
stack->top=node;
}
}
}
void push_d(Stack *stack, double x)
{
Node *node=(Node*)malloc(sizeof(Node));
if(node==NULL)
{
printf("Sorry no enough memory\n");
}
else
{
node->data.d=x;
node->link=NULL;
if(is_stack_empty(stack))
{
stack->top=node;
}
else
{
node->link=stack->top;
stack->top=node;
}
}
}
void pop(Stack *stack)
{
Node *runner=stack->top;
if(is_stack_empty(stack))
{
printf("Stack is empty.\n");
}
else
{
stack->top=stack->top->link;
free(runner);
}
}
void print_stack_c(Stack *stack)
{
Node *runner=stack->top;
if(is_stack_empty(stack))
{
printf("Stack is empty.\n");
}
else
{
while(runner!=NULL)
{
printf("%c,",runner->data.c);
runner=runner->link;
}
printf("\n");
}
}
void print_stack_d(Stack *stack)
{
Node *runner=stack->top;
if(is_stack_empty(stack))
{
printf("Stack is empty.\n");
}
else
{
while(runner!=NULL)
{
printf("%.4f,",runner->data.d);
runner=runner->link;
}
printf("\n");
}
}
int main(){
char input[150],output[150];
int i;
double j;
char a[20]="";
char b[20]="";
char c[10],d[10]="",e[10]="";
struct Stack operand;
struct Stack operator;
struct Stack tempstack;
initialize_stack(&tempstack);
initialize_stack(&operand);
initialize_stack(&operator);
scanf("%s",input); //store input to a string
//convert infix to postfix
for(i=0;i<strlen(input)-1;i++){
if(input[i]==' '){
continue;
}
else if(input[i]=='('){
push_c(&tempstack,input[i]);
}
else if(isdigit((unsigned char)input[i]) || input[i] == '.'){
strcpy(a,b);//clear
while(isdigit((unsigned char)input[i]) || input[i] == '.'){
strncat(a,&input[i],1);
i++;
}
j=atof(a);
push_d(&operand,j);
}
else{ //operand
}
}
print_stack_c(&tempstack);
print_stack_d(&operand);
}
Sie müssen auch Speichertyp wissen, was in Vereinigung ist. Sie können es wie folgt tun: typedef union { char c; doppelt d; } Wert; enum { double_t, operatuion_t } Werttyp; typedef struct { Wert v; Werttyp t; } stack_elem; – LZ041
Wie LZ041 sagte, um die in der Union gespeicherten Daten richtig zu verwenden, müssen Sie wissen, ob ein Zeichen oder ein Doppel gespeichert wurde. Sie können dies tun, indem Sie der Struktur Node eine Art Flag hinzufügen, sei es eine Aufzählung oder ein anderer Datentyp, in dem Sie zwei verschiedene Zustände speichern können, einen, der angibt, dass die Datenunion ein Zeichen enthält und einen Status, der angibt, dass sie gespeichert wird ein Doppel. Sie würden das Flag in Node entsprechend zur gleichen Zeit festlegen, zu der Sie die Daten speichern und dann das Flag überprüfen, bevor Sie die Daten abrufen. –
* Ich habe Probleme beim Speichern eines Chars und eines Double auf einem Stack. * Was ist das Problem, das Sie haben? –