C语言中栈和队列实现表达式求值的实例
C语言中栈和队列实现表达式求值的实例 栈和队列是数据结构中两个非常重要的概念,它们在计算机科学和编程语言中有着广泛的应用。栈和队列可以用来实现表达式求值,下面我们将通过C语言来实现栈和队列实现表达式求值的实例。 栈是一种后进先出(LIFO)的数据结构,栈可以用来存储和操作数据。栈有两个主要操作:压栈(Push)和出栈(Pop)。压栈操作是将数据压入栈中,而出栈操作是将栈顶元素弹出栈外。在表达式求值中,栈可以用来存储操作数和操作符,从而实现表达式的求值。 队列是一种先进先出(FIFO)的数据结构,队列可以用来存储和操作数据。队列有两个主要操作:入队(Enqueue)和出队(Dequeue)。入队操作是将数据添加到队列尾部,而出队操作是将队列头元素删除。在表达式求值中,队列可以用来存储中间结果,从而实现表达式的求值。 在C语言中,我们可以使用结构体来实现栈和队列。下面是一个简单的栈实现代码: ```c typedef int Status; typedef char StackElemtype; typedef struct Stack{ StackElemtype* base; StackElemtype* top; int stackSize; }Stack; Status StackInit(Stack* s){ s->base = (StackElemtype*)malloc(sizeof(StackElemtype) * STACK_SIZE); if( !s->base ) return ERROR; s->top = s->base; s->stackSize = STACK_SIZE; return OK; } Status Pop(Stack* s,StackElemtype* value){ if( s->base == s->top ){ printf("\nstack empty\n"); return ERROR; } *value = *(--(s->top)); return OK; } Status Push(Stack* s,StackElemtype value){ if( s->top - s->base == s->stackSize){ s->base = (StackElemtype*)realloc(s->base,sizeof(StackElemtype) * (STACK_INCREMENT + STACK_SIZE)); if( !s->base ) return ERROR; s->top = s->base + STACK_SIZE; s->stackSize = STACK_SIZE + STACK_INCREMENT; } *(s->top) = value; s->top++; return OK; } ``` 在上面的代码中,我们定义了一个栈结构体,包括栈的基地址、栈顶地址和栈的大小。我们还定义了三个函数:StackInit用于初始化栈,Pop用于出栈,Push用于压栈。 在表达式求值中,我们可以使用栈来存储操作数和操作符,从而实现表达式的求值。例如,我们可以使用栈来实现一个简单的四则运算表达式的求值: ```c void EvaluateExpression(){ Stack s; StackInit(&s); // 将操作数和操作符压入栈中 Push(&s, 1); Push(&s, 2); Push(&s, '+'); // 从栈中出栈操作数和操作符 int operand1, operand2; Pop(&s, &operand1); Pop(&s, &operand2); // 根据操作符进行相应的运算 int result; switch(operand2){ case '+': result = operand1 + operand2; break; // ... } printf("result: %d\n", result); } ``` 在上面的代码中,我们使用栈来存储操作数和操作符,然后从栈中出栈操作数和操作符,并根据操作符进行相应的运算。 队列也可以用来实现表达式求值,下面是一个简单的队列实现代码: ```c typedef double StackElemtype_ForValueExperssion; typedef struct Stack_2{ StackElemtype_ForValueExperssion* base; StackElemtype_ForValueExperssion* top; int stackSize; }Stack_2; Status StackInit_2(Stack_2* s){ s->base = (StackElemtype_ForValueExperssion*)malloc(sizeof(StackElemtype_ForValueExperssion) * STACK_SIZE); if( !s->base ) return ERROR; s->top = s->base; s->stackSize = STACK_SIZE; return OK; } Status Pop_2(Stack_2* s,StackElemtype_ForValueExperssion* value){ if( s->base == s->top ){ printf("\nstack empty\n"); return ERROR; } *value = *(--(s->top)); return OK; } Status Push_2(Stack_2* s,StackElemtype_ForValueExperssion value){ if( s->top - s->base == s->stackSize){ s->base = (StackElemtype_ForValueExperssion*)realloc(s->base,sizeof(StackElemtype_ForValueExperssion) * (STACK_INCREMENT + STACK_SIZE)); if( !s->base ) return ERROR; s->top = s->base + STACK_SIZE; s->stackSize = STACK_SIZE + STACK_INCREMENT; } *(s->top) = value; s->top++; return OK; } ``` 在上面的代码中,我们定义了一个队列结构体,包括队列的基地址、队列尾地址和队列的大小。我们还定义了三个函数:StackInit_2用于初始化队列,Pop_2用于出队列,Push_2用于入队列。 在表达式求值中,我们可以使用队列来存储中间结果,从而实现表达式的求值。例如,我们可以使用队列来实现一个简单的四则运算表达式的求值: ```c void EvaluateExpression_Queue(){ Stack_2 s; StackInit_2(&s); // 将操作数和操作符入队列 Push_2(&s, 1); Push_2(&s, 2); Push_2(&s, '+'); // 从队列中出队操作数和操作符 double operand1, operand2; Pop_2(&s, &operand1); Pop_2(&s, &operand2); // 根据操作符进行相应的运算 double result; switch((int)operand2){ case '+': result = operand1 + operand2; break; // ... } printf("result: %f\n", result); } ``` 在上面的代码中,我们使用队列来存储中间结果,然后从队列中出队操作数和操作符,并根据操作符进行相应的运算。 栈和队列都是数据结构中非常重要的概念,它们在计算机科学和编程语言中有着广泛的应用。在表达式求值中,我们可以使用栈和队列来实现表达式的求值。
- 粉丝: 7
- 资源: 952
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助