#include <stdio.h> #include<malloc.h> #include<math.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define FALSE 0 typedef int Statue; typedef int SElement; //typedef struct { // int a; //}SElement; SElement N; SElement e; typedef struct { SElement* base; SElement* top; int stacksize; }SqStack; SqStack s; Statue InitStack(SqStack *s) { s->base = (SElement*)malloc(STACK_INIT_SIZE * sizeof(SElement)); if (!s->base) exit(OVERFLOW); s->top = s->base; s->stacksize = STACK_INIT_SIZE; return OK; } Statue StackEmpty(SqStack s) { if (s.top == -1) return OK; else return FALSE; } Statue Push(SqStack* s, SElement e) { if (s->top - s->base >= s->stacksize) { s->base = (SElement*)malloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElement)); if (!s->base) exit(OVERFLOW); s->top = s->base + s->stacksize; s->stacksize += STACKINCREMENT; } *s->top++ = e; return OK; } Statue Pop(SqStack* s, SElement* e) { if (s->top == s->base) return FALSE; e = --s->top; return OK; } void conversion() { //SElement N; //SElement e; InitStack(&s); scanf_s("%d", N); while (&N) { Push(&s, N % 8); N = N / 8; } while (!StackEmpty) { Pop(&s, e); printf("%d", e); } } int main() { InitStack(&s); conversion(); return 0; }
时间: 2024-04-03 11:37:08 浏览: 23
这段代码存在多处问题:
1. 在头文件 `malloc.h` 中,`malloc` 函数应该是 `void* malloc(size_t size);` 而不是 `malloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElement));`,这里应该只传入一个参数,即需要分配的内存大小。
2. 在 `StackEmpty` 函数中,应该使用 `s.top == s.base` 判断栈是否为空,而不是 `s.top == -1`。
3. 在 `Pop` 函数中,应该使用 `*e = *(--s->top);` 将栈顶元素弹出,并将其赋值给 `e`。
4. 在 `conversion` 函数中,应该使用 `scanf_s("%d", &N);` 将输入的数据存储到变量 `N` 中,并且在 `while` 循环条件中应该使用 `N != 0` 而不是 `&N`。
5. 在 `conversion` 函数中,应该使用 `while (!StackEmpty(s))` 而不是 `while (!StackEmpty)`。
6. 在 `conversion` 函数中,应该使用 `Pop(&s, &e);` 将栈顶元素弹出,并将其赋值给 `e`。
7. 在 `main` 函数中,应该先调用 `InitStack(&s);` 初始化栈,再调用 `conversion()` 函数。
下面是修改后的代码:
相关问题
#include <stdio.h> #include<malloc.h> #include<math.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define FALSE 0 typedef int Statue; typedef struct { int a; }SElement; typedef struct { SElement* base; SElement* top; int stacksize; }SqStack; SqStack s; Statue InitStack(SqStack *s) { s->base = (SElement*)malloc(STACK_INIT_SIZE * sizeof(SElement)); if (!s->base) exit(OVERFLOW); s->top = s->base; s->stacksize = STACK_INIT_SIZE; return OK; } Statue StackEmpty(SqStack s) { if (s.top == -1) return OK; else return FALSE; } Statue Push(SqStack* s, SElement e) { if (s->top - s->base >= s->stacksize) { s->base = (SElement*)malloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElement)); if (!s->base) exit(OVERFLOW); s->top = s->base + s->stacksize; s->stacksize += STACKINCREMENT; } *s->top++ = e; return OK; } Statue Pop(SqStack* s, SElement* e) { if (s->top == s->base) return FALSE; e = --s->top; return OK; } void conversion() { SElement N; InitStack(&s); scanf("%d", N); while (&N) { Push(&s, N % 8); N = N / 8; } }
这段代码是一个简单的栈的实现,其中定义了一个结构体类型SElement,表示栈的元素,以及一个结构体类型SqStack,表示一个栈。该栈的基本操作有:初始化栈、判断栈是否为空、入栈、出栈。另外还有一个conversion函数,用于将输入的十进制数转换为八进制数并压入栈中。但是在代码中存在一些问题,例如在判断栈是否为空时,应该比较s.top和s.base的值而不是与-1比较;在Pop函数中,应该将出栈元素赋值给指针e,而不是将指针e重新赋值。
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #define TRUE 1 #define FALSE 0 // 表达式树结点结构体 typedef struct _etNode{ char data; // 结点数据:操作符或操作数 struct _etNode* left; // 左子树指针 struct _etNode* right; // 右子树指针 }ET
Node;
// 定义栈结构体
typedef struct _stack{
int top; // 栈顶指针
int size; // 栈的大小
ETNode** data; // 栈的数据
}Stack;
// 创建栈
Stack* createStack(int size){
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
s->size = size;
s->data = (ETNode**)malloc(sizeof(ETNode*)*size);
return s;
}
// 判断栈为空
int isEmptyStack(Stack* s){
return s->top == -1;
}
// 判断栈是否已满
int isFullStack(Stack* s){
return s->top == s->size-1;
}
// 入栈
void pushStack(Stack* s, ETNode* e){
if(isFullStack(s)){
printf("Stack is full!\n");
return;
}
s->data[++s->top] = e;
}
// 出栈
ETNode* popStack(Stack* s){
if(isEmptyStack(s)){
printf("Stack is empty!\n");
return NULL;
}
return s->data[s->top--];
}
// 获取栈顶元素
ETNode* getTopStack(Stack* s){
if(isEmptyStack(s)){
printf("Stack is empty!\n");
return NULL;
}
return s->data[s->top];
}
// 判断字符是否为操作符
int isOperator(char c){
switch(c){
case '+':
case '-':
case '*':
case '/':
case '^':
return TRUE;
default:
return FALSE;
}
}
// 创建表达式树
ETNode* createET(char* expr){
Stack* s = createStack(strlen(expr));
int i;
for(i=0; expr[i]!='\0'; i++){
if(isdigit(expr[i])){
// 如果是数字,则创建一个叶子结点
ETNode* node = (ETNode*)malloc(sizeof(ETNode));
node->data = expr[i];
node->left = NULL;
node->right = NULL;
pushStack(s, node);
}
else if(isOperator(expr[i])){
// 如果是操作符,则创建一个新的结点,并将栈顶的两个结点作为它的左右孩子
ETNode* node = (ETNode*)malloc(sizeof(ETNode));
node->data = expr[i];
node->right = popStack(s);
node->left = popStack(s);
pushStack(s, node);
}
else{
// 如果是无效字符,则忽略
continue;
}
}
return popStack(s);
}
// 计算表达式树的值
double calculateET(ETNode* root){
if(root == NULL){
return 0;
}
if(root->left == NULL && root->right == NULL){
// 如果是叶子结点,则返回它的值
return atof(&root->data);
}
double leftValue = calculateET(root->left);
double rightValue = calculateET(root->right);
switch(root->data){
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue / rightValue;
case '^':
return pow(leftValue, rightValue);
default:
return 0;
}
}
int main(){
char expr[100];
printf("请输入中缀表达式:");
gets(expr);
ETNode* root = createET(expr);
printf("表达式树创建成功!\n");
printf("表达式的计算结果为:%lf\n", calculateET(root));
return 0;
}