线性结构——用栈实现波兰表达式求值。
2017-04-14 22:57
295 查看
//PolishExpression_H.h
#pragma once //用栈实现兰波表达式求值 #define OK true #define ERROR false #define OVERFLOW -1 #define MAXSIZE 100 typedef float ElemType; typedef bool Status; typedef struct Stack { ElemType *base; ElemType *top; int stacksize; }STACK; Status InitStack(STACK &S); Status StackFull(STACK S); Status Push(STACK &S, ElemType e); Status StackEmpty(STACK S); ElemType Pop(STACK &S); void PolishExpression();
//PolishExpression_achieve
#include "PolishExpression_H.h" #include<stdio.h> #include<stdlib.h> Status InitStack(STACK &S) { S.base = new ElemType[MAXSIZE]; if (!S.base) { printf("内存分配失败!\n"); exit(OVERFLOW); } S.top = S.base; return OK; } Status StackFull(STACK S) { if (S.top - S.base == MAXSIZE) { return OK; } else return ERROR; } Status Push(STACK &S, ElemType e) { if (StackFull(S)) { printf("栈满!\n"); return ERROR; } *S.top = e; S.top++; return OK; } Status StackEmpty(STACK S) { if (S.base == S.top) { return OK; } else return ERROR; } ElemType Pop(STACK &S) { if (StackEmpty(S)) { return ERROR; } ElemType e; S.top--; e = *S.top; return e; } //逆波兰表达式(即后缀表达式)求值规则如下:设立运算数栈OPND, 对表达式从左到右扫描(读入),当表达式中扫描到数时,压入OPND栈。 //当扫描到运算符时,从OPND退出两个数,进行相应运算,结果再压入OPND栈。这个过程一直进行到读出表达式结束符$,这时OPND栈中只有一个数,就是结果。 //以$符作为输入结束,操作数之间用空格分隔, //操作符只可能有 + 、 - 、*、 / 四种运算。例如:234 34 + 2 * $。
void PolishExpression() { static int i = 0; STACK OPND; InitStack(OPND); static char ch[30]; printf("请输入表达式(以$符作为输入结束,操作数之间用空格分隔):\n"); scanf("%c", &ch[i]); float num = 0.00; float scale = 0.00; float x1 = 0.00, x2 = 0.00; while (ch[i] != '$') { while ((ch[i] >= '0' && ch[i] <= '9') || ch[i] == '.') { //拼数 if (ch[i] != '.' && ch[i] != ' ') { //处理整数 num = num * 10 + (ch[i] - '0'); i++; scanf("%c", &ch[i]); } if (ch[i] == '.') { //处理小数部分。 scale = 10.0; i++; scanf("%c", &ch[i]); while (ch[i] >= '0' && ch[i] <= '9') { num = num + (ch[i] - '0') / scale; scale = scale * 10; i++; scanf("%c", &ch[i]); } } } Push(OPND, num); num = 0.0;//数压入栈,下个数初始化 scale = 10.0; if (ch[i] == '+') { Push(OPND, Pop(OPND) + Pop(OPND)); } if (ch[i] == '-') { x1 = Pop(OPND); x2 = Pop(OPND); Push(OPND, x2 - x1); } if (ch[i] == '*') { Push(OPND, Pop(OPND)* Pop(OPND)); } if (ch[i] == '/') { x1 = Pop(OPND); x2 = Pop(OPND); Push(OPND, x2 / x1); } i++; scanf("%c", &ch[i]);//读入表达式中下一个字符。 } printf("后缀表达式的值为: %.2f", Pop(OPND)); printf("\n"); }
//PolishExpression_main
#include"PolishExpression_H.h" #include<stdio.h> int main() { PolishExpression(); return OK; }
相关文章推荐
- 数据结构课程设计---------用栈来实现表达式求值
- 数据结构之---C语言实现栈的表达式求值(表达式树)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构课程设计-用栈实现表达式求值的方法详解
- 数据结构实验2---表达式求值(“栈”实现)
- Java实现-逆波兰表达式求值
- 后缀表达式(逆波兰表达式),并求值(可求浮点、负数与大于10的数),C++实现
- 数据结构课程设计---------用栈来实现表达式求值
- 线性表的实现与应用--表达式中缀转后缀并求值
- 数据结构 学习笔记(三):线性结构:堆栈,队列,表达式求值,多项式加法运算
- 逆波兰表达式的转化与求值(python实现)
- 数据结构之用栈实现逆波兰表达式
- 数据结构之——用C++实现算术表达式求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- C++实现数据结构作业——表达式求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- 数据结构实现顺序线性表的一些小应用
- Linux系统下用C语言实现浮点数四则运算表达式的求值
- 表达式求值,中缀后缀转换,表达式递归直接求值等相关算法的实现