数据结构表达式求值有关问题
2015-07-27 21:32
309 查看
<span style="font-size:24px;">数据结构表达式求值问题 求代码 就是数据结构课本(严蔚敏)中栈中的一个问题,算法想的挺简单,不过实现起来着实困难, 例:计算 (3 + 2 * 2(1 + 3)) 就是建立两个栈一个字符一个数字 判断读入的是符号还是数据时要用ASCII码吗??? 希望高手能给个C的源代码!!!!</span>
<span style="font-size:24px;">#include<iostream> #include<stack> #include<cctype> #include<cstring> using namespace std; int isopra(char ch);//判断是不是运算符。 int priority(char ch);//判断优先权。 void trans(char *in,char *out);//将字符串转换成后辍学表达式。 int compute(char *chb);//计算 int reback(char ch,int a,int b);//传入一个运算符一两个数字,返回结果。 int main() { char cha[100],chb[100]; cin>>cha; trans(cha,chb); cout<<chb<<endl; cout<<compute(chb); } int isopra(char ch) { switch(ch) { case '+': case'-': case'*': case'/': case'(': case')': case'%': case'\0': return 1; default: return 0; } } int priority(char ch) { switch(ch) { case '+': case'-': return 1; case '*': case '/': case '%': return 2; default : return 0; } } void trans(char *in,char *out) { stack<char>s; s.push('\0');//设它优先权最低,作栈底。 while(*in!='\0') { if(isdigit(*in))*out++=*in++; //如果是数字,则写入后辍表达式 else if(isopra(*in)) {//如果是操作符, if(*in=='(')s.push(*in++);//如果是左括号,入栈; else if(*in==')') {//如果是右括号,将栈里的符号弹出,直到左括号。 while(s.top()!='(') { *out++=s.top(); s.pop(); } s.pop();//弹出左括号; in++;//指针移到右括号的后一位。 } else if(priority(*in)>=priority(s.top())) {//如果大于栈顶的优先权,入栈。 s.push(*in++); } else {//否则栈顶元素出栈,赋予后辍式。 *out++=s.top(); s.pop(); } } } while(priority('\0')<priority(s.top())) {//元素全部出栈,给后辍式。 *out++=s.top(); s.pop(); } *out='\0';//使后辍式成为字符串。 } int compute(char *chb) { stack<int>num; int a,b; while(*chb!='\0') { if(isdigit(*chb)) {//数字入栈。 num.push(*chb++-'0'); } else {//出两个元素出来计算,压入栈。 a=num.top();num.pop(); b=num.top();num.pop(); num.push(reback(*chb,a,b)); chb++; } } return num.top(); }</span><span style="font-size:18px;"> </span><strong><span style="font-size:24px;">int reback(char ch,int a,int b) { switch(ch) { case '+':return b+a; case '-':return b-a; case '/':return b/a; case '*':return b*a; case '%':return b%a; default:return 0; } }</span></strong>
相关文章推荐
- 数据结构链表之单循环链表
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 2015-07-27 20:49 13人阅读 评论(0) 收藏
- ZOJ 3886 Nico Number (线段树)
- 南阳oj 士兵杀敌(二) 题目116 NYOJ 数据结构
- 课程笔记 16:数据结构(清华) 图-邻接矩阵
- LeetCode 208. Implement Trie (Prefix Tree)
- 数据结构---单链表(1)
- 数据结构之并查集
- 【算法与数据结构】二叉树的构造
- 课程笔记 15:数据结构(清华) 图
- 数据结构之插入排序--折半插入排序
- 【自考】——数据结构导论(一)
- 数据结构实验:连通分量个数
- 数据结构实验之二叉树的建立与遍历
- 数据结构导论初步理解
- 数据结构上机实验之二分查找
- 数据结构之插入排序--直接插入排序
- 【数据结构|剑指Offer】单向链表的各项操作实现
- 数据结构实验:连通分量个数(并查集)