栈的基本操作及其应用 表达式求值
来源:互联网 发布:java rmi 无继承 框架 编辑:程序博客网 时间:2024/06/10 19:46
输入一个表达式求结果
因为程序的限制数的大小有限制
#include<stdio.h>#include<iostream> #include<cstdio>#include<stdlib.h> #include<string.h>#include<string>using namespace std;#define MAXSIZE 100#define OK 1#define ERROR 0#define OVERFLOW -1typedef char SElemType;typedef int Status;typedef struct{SElemType *base; //栈底指针 SElemType *top; //栈顶指针 int stacksize; //栈可用最大容量 }SqStack;//构造一个空栈Status InitStack (SqStack &S) { S.base = new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间 if(!S.base ) exit(OVERFLOW); //存储分配失败 S.top=S.base ; // top初始base,空栈 S.stacksize = MAXSIZE; //stacksize置为最大容量MAXSIZE return OK;}//入栈 Status Push(SqStack &S,SElemType e){//插入新的栈顶元素 e if(S.base - S.top == S.stacksize ) return ERROR; //栈空 *S.top ++ = e; //e压入栈列,栈顶指针加1 return OK;} //出栈 Status Pop(SqStack &S,SElemType &e){//插入新的栈顶元素 e if(S.base == S.top ) return ERROR; //栈空 e = *--S.top; //栈顶指针减1 ,将栈顶元素赋给e return OK;}//取栈顶元素 SElemType GetTop(SqStack S){//插入新的栈顶元素 e if(S.base != S.top ) //栈非空 return *(S.top - 1); //返回栈顶元素,栈顶指针不变 }//Inint In(char x1){if( x1 =='(' || x1 ==')' || x1 =='+' || x1 =='-' || x1=='*' || x1=='/' || x1=='#') return OK;else return ERROR;} char Operate(char i, char th,char j) //运算函数 {char k;i = i -'0';j = j -'0';switch( th ){case '+':k = i+j+'0';case '-':k = i-j+'0';case '*':k = i*j+'0';case '/':k = i/j+'0';}return k;}char Precede( char a,char b) //比较优先级 {switch( a ) {case '+': if( b == '+' || b == '-' || b == ')' || b == '#') return '>'; else if(b == '*' || b == '/' || b == '(') return '<'; break; case '-': if( b == '+' || b == '-' || b == ')'|| b == '#' ) return '>'; else if( b == '('|| b == '*' || b == '/' ) return '<'; break; case '*': if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '*' || b == '/' ) return '>'; else if( b == '(') return '<'; break; case '/': if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '*' || b == '/' ) return '>'; else if( b == '(') return '<'; break; case '(': if( b == ')') return '='; else if( b == '+' || b == '-' || b == '('|| b == '*' || b == '/') return '<'; break; case ')': if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '/' || b == '*') return '>'; break; case '#': if( b == '#') return '='; else if(b == '+' || b == '-' || b == '('|| b == '#' || b == '/' || b == '*') return '<';break;}}//表达式求值char EvaluateExpersion(){//算数表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作符栈 SElemType ch; SqStack OPTR; SqStack OPND; char x; InitStack(OPTR); //初始化OPTR栈 InitStack(OPND); //初始化OPND栈 Push(OPTR,'#'); //将表达式起始符“# ”入OPTR栈 cin>>ch; char theta,a,b; while( ch!='#' || GetTop(OPTR) != '#' ) //表达式没有扫描完毕或者OPTR的栈顶元素不为“# ” {if( !In(ch) ) //ch不是运算符则进OPND栈 { Push(OPND,ch); cin>>ch;}else switch( Precede( GetTop(OPTR),ch) ) //比较栈顶元素和ch的优先级 { case '<': Push(OPTR,ch); //将当前字符压入OPTR栈,读入下一字符ch cin>>ch; break; case '>': Pop(OPTR,theta); //弹出OPTR栈顶的运算符 Pop(OPND,b); //弹出OPTR栈顶的两个运算数 Pop(OPND,a); Push(OPND,Operate(a,theta,b)); //将运算结果压入OPND栈 break; case '=': //OPTR栈的栈顶元素是”( ”且 ch是 “) ” Pop(OPTR , x); // 弹出OPTR的栈顶的“( ” ,读入下一字符ch cin>>ch; break; }}return GetTop(OPND)-'0'; //OPND栈顶元素即表达式求值结果 } int main(){cout<<"表达式结果为:"<<EvaluateExpersion()<<endl;return 0;}
阅读全文
0 0
- 栈的基本操作及其应用 表达式求值
- 栈的应用 表达式求值
- 表达式求值【栈的应用】
- 栈的应用表达式求值
- 栈的应用-表达式求值
- 栈的应用 表达式求值
- 第三章:顺序栈及其应用之一---表达式求值
- 栈应用 表达式求值
- 栈的应用-四则运算表达式的求值
- 栈的一个应用表达式求值
- 栈的应用--算术表达式求值
- 表达式求值(栈的应用)(C++)
- 栈的应用——表达式求值
- 数据结构 栈的应用-- 表达式求值
- 四则运算表达式求值(栈的应用)
- NYOJ 35 表达式求值【栈的应用】
- 表达式求值——栈的应用
- 【数据结构】栈的应用 I :表达式求值
- 网络编程(2)
- python安装第三方包packages
- scrapyd的安装和基本使用
- 2017 ACM-ICPC ECL-FINAL 部分代码
- MySQL异常:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止。
- 栈的基本操作及其应用 表达式求值
- 属性组合动画
- 对自执行函数的理解
- 剑指offer 编程题(17):二叉树的镜像
- String类对象的创建使用,雇员对象的操作
- reids 笔记
- dom操作表格和样式
- 利用反射实现子类继承父类的值
- vs2010编译什么程序都失败,无法打开库里自带的文件如stdio.h