栈-表达式求值
来源:互联网 发布:win10要求输入网络凭证 编辑:程序博客网 时间:2024/04/27 21:31
/*栈的顺序存储-表达式求值*///假设输入字符不超过20个,运算数字都是非负的整数,即0,1,2,,,,等等//#include<iostream>#include<stdlib.h>//为了使用atoi函数,具体函数用法及作用参见百度或C plus plus 网站using namespace std;/*(1+9)*2/2-1=9(1+9)*2/20-1=01+0=1*/template<typename T>struct Stack{T *t;T *base;T *top;};/*1.初始化栈*/template<typename T>bool init(Stack<T> &stack){stack.t = new T[400];//假设运算数和运算符的长度都不超过40if (!stack.t) { exit(0); }stack.base = stack.top = stack.t;return true;}/*2.入栈,入栈元素为e*/template<typename T>bool push(Stack<T> &stack, T e){//cout << "入栈" << e << endl;*stack.top++ = e;return true;}/*3.出栈,top指针下移*/template<typename T>T pop(Stack<T> &stack){if (stack.base == stack.top) { cout << "空栈无法出栈操作!\n"; exit(0); }T temp = *--stack.top;return temp;}/*4.返回栈顶元素,栈顶指针不移动*/template<typename T>T getTop(Stack<T> &stack){if (stack.base == stack.top) { cout << "空栈无法操作!\n"; exit(0); }return *(stack.top - 1);}/*5.返回运算符优先级*/int getLevel(char &c){switch (c){case '+':case '-':return 1;case '*':case '/':return 2;default:return 0;//包括小括号,和#}}/*6.返回一个整数的位数*/int getNum(int e)//使用引用要记住引用的数可不可以改变,{int number = 0;if (e == 0)//当初没想到这个,导致在输入数据1+0时奔溃了。。。return 1;while (e != 0){number++;e = e / 10;}return number;}/*7.四则运算,两个整数通过op运算符进行运算*/int operate(int &one, char &op, int &two){switch (op){case '+':return one + two;case '-':return one - two;case '*':return one*two;case '/':return one / two;}}/*8.利用栈求出表达式的最终解,oper是运算符栈,opnd是运算数栈*/int evaluate(char *p)//不允许使用多个模板作为参数??????{Stack<int> opnd;Stack<char> oper;init(oper);init(opnd);push(oper, '#');//参数列表不能为引用,不然报错while (*p != '\0'){/*1*/if (*p >= '0'&&*p <= '9')//如果是数字,考虑到数字不一定一位数,所以做特殊处理,转化为正常的数字,压入栈{int temp = atoi(p);p = p + getNum(temp);//此时p指向数字后的第一个非数字push(opnd, temp);////////////////////////////////////}/*2*/else if (*p == '('){push(oper, '(');p++;}/*3*/else if (*p == ')'){while (getTop(oper) != '(')//while一直找到'(' ; 例如(1+2*3)*5{char ch = pop(oper);int right = pop(opnd);int left = pop(opnd);int end = operate(left, ch, right);push(opnd, end);}pop(oper);//去掉左括号(p++;}/*4*/else //加减乘除四个情况{char ch = getTop(oper);int topLevel = getLevel(ch);int currentLevel = getLevel(*p);//比较运算符优先级if (topLevel < currentLevel)push(oper, *p);else{int right = pop(opnd);int left = pop(opnd);int temp = operate(left, ch, right);pop(oper);//ch运算符已使用,需删掉push(opnd, temp);//进栈push(oper, *p);}p++;}}//while (*p != '\0')while (getTop(oper) != '#')//做最后处理{char ch = pop(oper);int right = pop(opnd);int left = pop(opnd);int end = operate(left, ch, right);push(opnd, end);}return getTop(opnd);}int main(){//假设输入字符不超过20个,运算数字都是非负的整数,即0,1,2,,,,等等char a[400];cin >> a;cout << evaluate(a) << endl;return 0;}
2 0
- 栈表达式求值程序
- 栈实现表达式求值
- 栈:表达式求值
- <数据结构>栈-表达式求值
- NYOJ35 表达式求值 【栈】
- 栈应用 表达式求值
- 表达式求值【栈】
- NYOJ35 表达式求值【栈】
- 栈模拟表达式求值
- 栈实现表达式求值
- 栈实现表达式求值
- 栈-表达式求值
- 前缀表达式求值--栈
- 表达式求值(栈)
- 表达式求值(栈实现)
- [笔记]:[栈] 表达式求值
- 【新手 表达式求值】 顺序栈实现表达式求值
- 顺序栈实现表达式求值
- 文件 字符串-->MD5码
- 在VC中给Slider添加定制的Tooltips
- swing 选项框(全选)
- 九度OJ 1058:反序输出 (基础题)
- H264编码 封装成MP4格式 视频流 RTP封包
- 栈-表达式求值
- swing 选项框(遍历选中的)
- Android Studio下安装Volley
- hive1.1安装
- python获取当前路径的方法
- swing 关闭主窗口退出EXIT_ON_CLOSE
- 将list集合进行切割 转换为队列进行处理
- android 的SDK的更新
- Address already in use: JVM_Bind(端口冲突)