当前位置:文档之家› 利用栈实现多项式的计算,

利用栈实现多项式的计算,

/***************************//利用栈实现多项式的计算,//如输入: 3*(7-2)#//输出:3*(7-2)#=15//清华大学——数据结构——53页****************************/// v4.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#define STACK_INIT_SIZE 100 //定义初始栈的大小#define Status bool/***************************//定义栈元素的结构****************************/typedef char ElemType;typedef struct{ElemType * base;ElemType * top;int stacksize;} Stack;/***************************//栈的初始化****************************/void InitStack( Stack & s){s.base = ( ElemType *) malloc ( STACK_INIT_SIZE );s.top = s.base;s.stacksize = STACK_INIT_SIZE;}/***************************//取栈顶元素****************************/ElemType GetTop(Stack s){return ( *(s.top - 1));}/***************************//压栈****************************/void Push(Stack &s, ElemType e){* s.top ++ = e;}/***************************//弹栈****************************/void Pop(Stack &s, ElemType & e){e = * -- s.top;}#define OPSETSIZE 7unsigned char prior[7][7] = {'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};char OPSET1[7] = {'+', '-' , '*' , '/' ,'(' , ')' , '#'};/******************************************************//判断是否运算符,若是运算符则返回真,不是则返回假*******************************************************/ int In1( char c){bool find = false;for( int i =0; i< 7; i ++){if( OPSET1[i] == c ){find = true;break;}}return find;}/****************************************************** //判断是否运算符,若是运算符则返回真,不是则返回位置*******************************************************/ int GetPos(char c){bool find = false;int i =0;for( i =0; i< 7; i ++){if( OPSET1[i] == c ){find = true;break;}}return i;}/****************************************************** //判断两个操作符的优先级*******************************************************/ char precede1( char a, char b){return prior[GetPos(a)][GetPos(b)];//返回运算符比较的结果}char Operate1( char a, char theta, char b){switch(theta){case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;}return 0;}/******************************************************//主要处理函数*******************************************************/char EvaluateExpression(char* MyExpression){Stack OPTR; //运算符寄存器Stack OPND; //操作数寄存器char a,b;char theta,*c,x;InitStack (OPTR); //初始化OPTR栈Push (OPTR, '#'); //压栈"#"InitStack (OPND); //初始化OPND栈c = MyExpression;while (*c!= '#' || GetTop(OPTR)!= '#') {if (!In1(*c)) { //不是运算符则进栈Push(OPND, *c-'0');c++;}else {switch (precede1(GetTop(OPTR), *c)) { //判断运算符栈顶运算符theta1与读入运算符theta2之间的优先关系case '<': // 栈顶元素优先权低Push(OPTR, *c);c++;break;case '=': // 脱括号并接收下一字符Pop(OPTR, x);c++;break;case '>': // 退栈并将运算结果入栈Pop(OPTR, theta);Pop(OPND, b);Pop(OPND, a);Push(OPND, Operate1(a, theta, b));break;} // switch}} // whilereturn GetTop(OPND);} // EvaluateExpressionvoid main(){//char * str = "3*(7-2)#";char str[100];while(1){printf("请输入表达式:\n");scanf("%s",str);unsigned char d = EvaluateExpression(str);printf(" %s = %d \n",str,d);}}。

相关主题