#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; } }
时间: 2024-04-04 08:29:21 浏览: 24
这段代码是一个简单的栈的实现,其中定义了一个结构体类型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;
}
#include <stdio.h> #include <stdlib.h> #include <cstdio>//cstdio是将stdio.h的内容用C++头文件的形式表示出来。 #define N 10 #define M 5 typedef struct SeqStack { int stacksize; int *base; int *top; }SeqStack; void Initstack(SeqStack *S)//初始栈 { S->base=(int *)malloc(N*sizeof(int)); if(!S->base) exit(1); S->top=S->base; S->stacksize=N; }什么意思
这段代码是定义了一个结构体 SeqStack,其中包含了栈的基本信息,如栈底指针、栈顶指针和栈的大小。在这个结构体里面,使用了指针来实现动态内存分配。它还定义了一个函数 Initstack,用于初始化栈。具体来说:
- 定义了一个结构体 SeqStack,其中包含了三个成员:stacksize、base 和 top。其中 stacksize 表示栈的大小,base 表示栈底指针,top 表示栈顶指针。
- 使用 #define 定义了宏 N 和 M,分别表示栈的最大容量和测试用例个数。
- 在 Initstack 函数中,首先使用 malloc 函数为栈分配内存空间(大小为 N*sizeof(int)),如果分配失败,程序就会退出。然后将栈底指针和栈顶指针都指向栈的基地址,表示栈为空。最后将栈的大小设置为 N。
- 函数中使用了指针变量传递参数,即参数 SeqStack *S 表示传递一个指向 SeqStack 结构体的指针。
相关推荐
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)