请指出这段代码的错误,并分析原因#include<stdio.h> #include<stdlib.h> typedef struct Stack { int* stack; int top; }ST; void StackInit(ST* st, int len) { st->stack = (int*)malloc(sizeof(int) * len); st->top = 0; } void StackPush(ST* st, int val) { // printf("val = %d\n",val); st->stack[st->top] = val; st->top++; } int StackPop(ST* st) { st->top--; return st->stack[st->top]; } int evalRPN(char** tokens, int tokensSize) { ST* st = (ST*)malloc(sizeof(ST)); StackInit(st, tokensSize); for (int i = 0; i < tokensSize; i++) { printf("val = %c\n", (*tokens)[i]); if ((*tokens)[i] >= '0' && (*tokens)[i] <= '9') { StackPush(st, (*tokens)[i] - '0'); //入栈 } else { int num_1 = StackPop(st); printf("num_1 = %d\n", num_1); int num_2 = StackPop(st); printf("num_2 = %d\n", num_2); switch ((*tokens)[i]) { case '+': StackPush(st, num_2 + num_1); break; case '-': StackPush(st, num_2 - num_1); break; case '*': StackPush(st, num_2 * num_1); break; case '/': StackPush(st, num_2 / num_1); break; } } } return st->stack[--(st->top)]; } int main() { char s[] = { '2','1',' + ','4',' * '}; char* str = &s; printf("val = %c\n", *(str + 1)); int val = evalRPN(&s, 5); printf("val = %d\n", val); return 0; }
时间: 2024-01-21 15:03:08 浏览: 71
这段代码存在以下错误:
1.在main函数中,定义了一个字符数组s,但是在定义指针变量str时,将&s赋值给了它,这是错误的。应该修改为:
```char* str = s;```
2.在evalRPN函数中,switch语句中的case应该是用单引号而不是双引号括起来的字符,例如:
```case '+':```
而不是
```case "+":```
3.在evalRPN函数中,tokens是一个指向字符指针的指针,因此需要使用二级指针来访问tokens指向的字符数组中的元素。例如:
```(*tokens)[i]```
而不是
```tokens[i]```
4.在main函数中,将字符数组s的地址作为参数传递给了evalRPN函数,但是字符数组s中的元素不是合法的逆波兰表达式。应该修改为:
```char s[] = {'2', '1', '4', '*', '+'};```
修改后的代码如下:
相关问题
本题目要求利用栈的基本操作,实现一个清空顺序栈S的算法。 #include <stdio.h> #include <math.h> #include <stdlib.h> typedef int DataType; /*栈中允许存储的元素的最大个数*/ #define STACKSIZE 100 /* 顺序栈的定义 */ typedef struct
{
DataType data[STACKSIZE]; // 存储栈的元素
int top; // 栈顶指针,指向栈顶元素在data数组中的下标
} SeqStack;
/* 初始化栈 */
void InitStack(SeqStack *S)
{
S->top = -1; // 栈顶指针初始化为-1,表示栈为空
}
/* 判断栈是否为空 */
int StackEmpty(SeqStack S)
{
return (S.top == -1);
}
/* 判断栈是否已满 */
int StackFull(SeqStack S)
{
return (S.top == STACKSIZE - 1);
}
/* 进栈 */
int Push(SeqStack *S, DataType x)
{
if (StackFull(*S)) // 栈已满,不能再进栈
{
return 0;
}
else
{
S->top++; // 栈顶指针加1
S->data[S->top] = x; // 将x存入栈顶元素
return 1;
}
}
/* 出栈 */
int Pop(SeqStack *S, DataType *x)
{
if (StackEmpty(*S)) // 栈为空,不能出栈
{
return 0;
}
else
{
*x = S->data[S->top]; // 将栈顶元素出栈
S->top--; // 栈顶指针减1
return 1;
}
}
/* 清空栈 */
void ClearStack(SeqStack *S)
{
S->top = -1; // 直接将栈顶指针置为-1,表示栈为空
}
#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;
}
阅读全文