表达式求解

表达式求解问题

第四次数据结构实验:

实验三:表达式求值

 

 

实验目的:

1、掌握顺序栈结点类型的定义

2掌握栈的插入和删除结点操作的特点;

3、熟悉对栈的一些基本操作和具体的函数定义。

代码:

 

 

  1 /* Status.h 各种常量状态、结构体的声明文件*/
  2 #pragma once
  3 #include <malloc.h>
  4 #include <stdlib.h>
  5 
  6 #define TRUE 1
  7 #define FALSE 0
  8 #define OK 1
  9 #define ERROR 0
 10 #define OVERFLOW -2
 11 #define INFEASIBLE -1
 12 
 13 typedef int Status;
 14 
 15 typedef char SElemType;
 16 #define STACK_INIT_SIZE 100
 17 #define STACKINCREMENT  10
 18 struct SqStack{
 19     SElemType *base;
 20     SElemType *top;
 21     int stacksize;
 22 };
 23 
 24 typedef char QElemType;
 25 #define MAXQSIZE 100
 26 struct SqQueue{
 27     QElemType *base;
 28     int front;
 29     int rear;
 30 };
 31 
 32 /* SqStack.h CSqStack类的声明文件*/
 33 #pragma once
 34 #include "Status.h"
 35 
 36 class CSqStack
 37 {
 38 private:
 39     //栈数据结构
 40     SqStack S;
 41 public:
 42     CSqStack(void);
 43     ~CSqStack(void);
 44     //压栈
 45     Status Push(SElemType e);
 46     //出栈
 47     Status Pop(SElemType& e);
 48     //返回栈顶元素,非弹出
 49     char GetTop();
 50     //判断是否为空
 51     bool Empty();
 52 private:
 53     //初始化栈数据结构,放在构造函数里,私有了..
 54     Status InitStack();
 55 };
 56 /* SqStack.h CSqStack类的定义文件*/
 57 #include "SqStack.h"
 58 
 59 CSqStack::CSqStack(void)
 60 {
 61     this->InitStack();
 62 }
 63 
 64 CSqStack::~CSqStack(void)
 65 {
 66     free(this->S.base);
 67 }
 68 
 69 //压栈
 70 Status CSqStack::Push(SElemType e)
 71 {
 72     if (S.top - S.base >= S.stacksize)
 73     {
 74         S.base = (SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
 75         if (!S.base)
 76             exit(OVERFLOW);
 77         S.top = S.base + S.stacksize;
 78         S.stacksize += STACKINCREMENT;
 79     }
 80     *S.top++ = e;
 81     
 82     return OK;
 83 }
 84 
 85 //出栈
 86 Status CSqStack::Pop(SElemType& e)
 87 {
 88     if (S.top == S.base)
 89         return ERROR;
 90     e = *--S.top;
 91 
 92     return OK;
 93 }
 94 
 95 //返回栈顶元素,非弹出
 96 char CSqStack::GetTop()
 97 {
 98     if(S.top == S.base)
 99         return ' ';
100 
101     return *(S.top-1);
102 }
103 
104 //判断是否为空
105 bool CSqStack::Empty()
106 {
107     return S.top == S.base ? TRUE : FALSE ; 
108 }
109 
110 //初始化栈数据结构,放在构造函数里,私有了..
111 Status CSqStack::InitStack()
112 {
113     S.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
114     if(!S.base)
115         exit(OVERFLOW);
116     S.top = S.base;
117     S.stacksize = STACK_INIT_SIZE;
118 
119     return OK;
120 }
121 
122 /* 
123 ///
124 Main.cpp 
125 main函数所在文件
126 0x0o@Live.Cn
127 08.11.05
128 Vista-U + VS2008 下编译通过.
129 
130 */
131 
132 #include <iostream>
133 #include "Status.h"
134 #include "SqStack.h"
135 using namespace std;
136 
137 char Operate(char a,char ch,char b)
138 {
139     switch (ch)
140     {
141     case '+':
142         return a+b-48;
143     case '-':
144         return a-b+48;
145     case '*':
146         return (a-48)*(b-48)+48;
147     case '/':
148         return (a-48)/(b-48)+48;
149     }
150 }
151 
152 char Precede(char ch1,char ch2)
153 {
154     if (ch1==ch2 && ch2=='#')
155         return '=';
156     if (ch1==ch2 && ch1!='#')
157         return '>';
158     if (ch1 == '#')
159         return '<';
160     if (ch1=='(' && ch2==')')
161         return '=';
162     if (ch1== '(' || ch2=='(')
163         return '<';
164     if (ch2== ')' || ch1==')')
165         return '>';
166     if(ch1=='*' || ch1=='/')
167         return '>';
168     if (ch2=='*' || ch2=='/')
169         return '<';
170     else
171         return '>';
172 }
173 
174 bool IsOpnd(char ch)
175 {
176     if( ch>=48 && ch<=57)
177         return TRUE;
178     else
179         return FALSE;
180 }
181 
182 char EvaluateExpression(CSqStack& OPND,CSqStack& OPTR)
183 {
184     char ch;
185     ch = getchar();
186 
187     while (ch != '#' || OPTR.GetTop() != '#')
188     {
189         if(IsOpnd(ch))
190         {
191             OPND.Push(ch);
192             ch = getchar();
193         }
194         else
195         {
196             switch (Precede(OPTR.GetTop(),ch))
197             {
198             case '<':
199                 OPTR.Push(ch);
200                 ch = getchar();
201                 break;
202             case '=':
203                 char x;
204                 OPTR.Pop(x);
205                 ch = getchar();
206                 break;
207             case '>':
208                 char theta,a,b;
209                 OPTR.Pop(theta);
210                 OPND.Pop(b);OPND.Pop(a);
211                 OPND.Push(Operate(a,theta,b));
212                 break;
213             default:
214                 cout<<"Error!"<<endl;
215             }
216         }
217     }
218     
219     return OPND.GetTop();
220 
221 }
222 
223 int main()
224 {
225     char ch;
226     CSqStack OPTR,OPND;
227     cout<<"Please Input The Expression:"<<endl;
228 
229     OPTR.Push('#');
230 
231     ch = EvaluateExpression(OPND,OPTR);
232 
233     cout<<(int)(ch-48)<<endl;
234 
235 
236     return 0;
237 }
238 

 

 

 

 

以上代码存在问题!

很明显,用char来存输入的数据,如果100*2怎么办?弹出来的是0….太尴尬了

这个问题其实也挺好解决的,例如:堆栈的数据类型是int,然后把字符接收时处理,如果下一个还是数字,就把此数字×10+下一个数字,接受完的时候再存入堆栈即可..

问题是这个代码的其它地方我还没跟踪明白,貌似构造的表达式出现某某现象时,最终结果是一个错误的数字

哎,懒得改了..>

 

今天代码写的有点取巧了,明显用的就是回文序列里面的代码,复用果真很舒服,省了很多时间的说

 

 

 

                                       --------by   0x0o

                                          Time 08.11.05 1541

 

转载于:https://www.cnblogs.com/ns517/archive/2008/11/05/1327378.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

date()

$ttime(); echo date("Y-m-d H:i:s",$t); 第一个参数的格式分别表示: a - "am" 或是 "pm" A - "AM" 或是 "PM" d - 几日&#xff0c;二位数字&#xff0c;若不足二位则前面补零; 如: "01" 至 "31" D -…

Absolute C++ Chapter 3 Self-Test Exercise(3)

15. Hello Goodbye One more time Hello End of program 16. It will occur an error only there is 0 person to divide to ice-cream. 17. #include<iostream> using namespace std; void product(int num1,int num2,int num3); int main() {  cout<<"Gi…

棍子节快乐~ 顺便转一篇weka源码分析解析~【转自weka中文网】

经常看到有人问&#xff0c;我想修改Weka里面的算法&#xff0c;我想把Weka的算法加到我自己的程序里面去&#xff0c;但是我该从哪里着手呢&#xff1f;于是&#xff0c;这篇帖子就有必要出现了。但是&#xff0c;这个题目太大了&#xff0c;Weka里面有那么多代码呢&#xff0…

Android中弹出对话框,AlertDialog关键代码

写在这里便于以后查看。 Android中弹出对话框的关键代码&#xff1a; 1 btn01.setOnClickListener(new OnClickListener() {2 3 Override4 public void onClick(View v) {5 Toast.makeText(musicActivity.this, "tanchu", 1…

poj 2226 Muddy Fields 最小顶点覆盖

题目链接&#xff1a;http://poj.org/problem?id2226 这道题跟上一道很相似不同之处在于这里不是整行或者整列的删&#xff0c;而是连续的几个可以一起删&#xff0c;不连的不能删&#xff0c;这就要对原图进行处理&#xff0c;对原有的图行由上到下&#xff0c;列由左到右进行…

python抓取网站URL小工具

1、安装Python requests模块&#xff08;通过pip&#xff09;&#xff1a; 环境搭建好了&#xff01; 2、测试一下抓取URL的过程&#xff1a; 抓取出来的URL有JavaScript代码&#xff0c;正则上还有待更加完善&#xff0c;有兴趣的可以研究下~&#xff01; 工具源代码: #coding…

二叉树特性及详细例子

二叉树的性质 一般二叉树性质&#xff1a; 在非空二叉树的k层上&#xff0c;至多有2k个节点(k>0)高度为k的二叉树中,最多有2k1-1个节点(k>0)对于任何一棵非空的二叉树,如果叶节点个数为n0&#xff0c;度数为2的节点个数为n2&#xff0c;则有: n0 n2 1完全二叉树性质:只…

C#抽象类与接口的比较

相同点 ●都不能被直接实例化&#xff0c;都可以通过继承实现其抽象方法。 ●都是面向抽象编程的技术基础&#xff0c;实现了诸多的设计模式。 不同点 ●接口支持多继承&#xff1b;抽象类不能实现多继承。 ●接口只能定义抽象规则&#xff1b;抽象类既可以定义规则&#xff0c…

创建 Spring容器的三种方式

一、src路径下打包完在war包的classes层级下 1、Spring容器创建的三种方式 创建Bean容器之后创建对象&#xff1a; 其中第三种使用的是BeanFactory对象 2、spring通过配置文件用容器创建对象的原理 转载于:https://www.cnblogs.com/wmqiang/p/11537638.html

OpenSSL以及私有CA的搭建

首先我们肯定会问什么是OpneSSL,以及OpenSSL有什么用&#xff1f;当让这不仅是刚接触Linux的我想知道&#xff0c;相信大多数人和我一样也非常想知道&#xff0c;因为OpenSSL是linux上基础的服务之一&#xff0c;了解它的应用可以帮助我们更好的了解linux。那么我们先了解下什么…

重新修复安装.netframework2.0

有时候由于各种原因&#xff0c;导致.net组件失效&#xff0c;不防试试修复一下: CMD里运行: C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -u C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i转载于:https://www.cnblogs.com/comcy…

电话骗术升级了,提高警惕! (转自公司内部新闻组,真人真事)

事情经过: 今天早上家里的座机接到10000号打来的欠费电话,电脑语音提示欠费2600多元,然后我就很惊讶,挂断后就打10000号查询(手动拨号,并不是回拨的).一切都跟平常打10000号一样的语音提示,一步步操作,最后转到人工台,查询结果是欠费2600多,我说不可能,平常打电话都是用手机居多…

yii使用寻呼功能

CDbCriteria这是类包使用&#xff0c;包是yii自带专门用来处理类似分类这种功能的。而我们使用yii框架然后调用这种方法会起到事半功倍的效果&#xff0c;会发现使用这个可以节省非常多的时间。让你高速的使用PHP中分页的功能。 还要使用的一个类包就是CPagination&#xff0c;…

VTK:一个面向对象的可视化类库(zz)

VTK&#xff1a;一个面向对象的可视化类库(zz) &#xff08;高隽 黄伟 合肥工业大学计算机与信息学院 合肥 230009&#xff09; 摘要 Visualization Toolkit 是一个面向对象的可视化类库&#xff0c;它为从事可视化应用程序开发的广大科研工作者提供直接的技术支持。VTK…

装配Bean的三种方式

一、装配Bean就是在xml写一个Bean标签&#xff1b;装配完Bean,还需要读取xml配置文件创建Spring容器来创建对象&#xff1b; 1、new 实现类方式 正常的三种创建Bean容器的方法都可以根据装配的Bean创建的Bean对象&#xff1b; 2、静态工厂模式方式 其中&#xff0c;静态工厂方式…

通用权限管理系统组件 (GPM - General Permissions Manager) 权限管理以前我们都是自己开发,可是到下一个系统又不适用,又改,加上人员流动大,管理很混乱...

权限管理以前我们都是自己开发&#xff0c;可是到下一个系统又不适用&#xff0c;又改&#xff0c;加上人员流动大&#xff0c;管理很混乱 Ψ吉日嘎拉 采用通用权限管理系统&#xff0c;这些烦恼就少了很多了&#xff0c;很固定&#xff0c;很稳定。 权限管理系统是否支持按组织…

Mahout 介绍

1.Hbasek-means (G级别) 2.k-meansmr (T级别)1. 2.canopy 2.贝叶斯算法 决策&#xff0c;分类&#xff0c;文档分类3.推荐系统 4.图书推荐系统 1.需求 付完款的用户90%都要回到购物车看看自己买的东西是否少买/多买 猜你喜欢 购买组合 内部推荐系统测试jps查询 转载于:https:/…

只能打开一进程

#define MUTEX_NAME _T("shit") //unicode环境下 /*#define MUTEX_NAME “shit" //多字节环境下*/ if (NULL OpenMutex(MUTEX_ALL_ACCESS, FALSE, MUTEX_NAME)) { CreateMutex(NULL, FALSE, MUTEX_NAME); } else { exit (0); } 转载于:https:…

Android游戏开发系统控件-CheckBox

Android游戏开发系统控件-CheckBox 2012/5/11 星期五 CheckBox是Android系统最普通的UI控件&#xff0c;继承了Button按钮 下面通过一个实例来学习 作者&#xff1a;wwj 功能&#xff1a;实现复选框的功能 创建项目“CheckBoxProject” 运行项目效果截图&#xff1a; 代码实现&…

改变Fragment的默认动画

FragmentTransaction ft getFragmentManager().beginTransaction(); //设置进入退出动画 ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);DetailsFragment newFragment DetailsFragment.newInstance();ft.replace(R.id.details_fragment_container, …