嵌入式
编程与应用
posts - 14, comments - 1, trackbacks - 0, articles - 0
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
链式栈及用其测试的计算器
Posted on 2010-04-17 10:59
陈显锋
阅读(297)
评论(0)
编辑
收藏
引用
所属分类:
数据结构程序
#ifndef STACK_CLASS
#define
STACK_CLASS
#include
<
iostream
>
using
namespace
std;
template
<
class
T
>
class
Stack
{
public
:
virtual
bool
Push(T x)
=
0
;
virtual
bool
Pop()
=
0
;
virtual
T Top()
const
=
0
;
virtual
void
Clear()
=
0
;
virtual
bool
IsEmpty()
const
=
0
;
}
;
#endif
//
STACK_CLASS
#ifndef LINKEDSTACK_CLASS
#define
LINKEDSTACK_CLASS
//
#include"Stack.h"
template
<
class
T
>
class
LinkedStack;
template
<
class
T
>
class
Node
{
private
:
T elements;
Node
<
T
>
*
link;
friend
class
LinkedStack
<
T
>
;
}
;
template
<
class
T
>
class
LinkedStack
//
:public Stack<T>
{
public
:
LinkedStack()
{top
=
NULL;}
~
LinkedStack();
bool
IsEmpty()
const
{
return
top
==
NULL; }
T Top()
const
;
bool
Push(T x);
bool
Pop();
void
Clear();
private
:
Node
<
T
>
*
top;
}
;
#endif
//
LINKEDSTACK_CLASS
template
<
class
T
>
LinkedStack
<
T
>
::
~
LinkedStack()
{
Node
<
T
>*
p
=
top;
while
(p)
{
p
=
top
->
link;
delete top;
top
=
p;
}
}
template
<
class
T
>
T LinkedStack
<
T
>
::Top()
const
{
return
top
->
elements;
}
template
<
class
T
>
bool
LinkedStack
<
T
>
::Push(T x)
{
Node
<
T
>*
p
=
new
Node
<
T
>
;
p
->
elements
=
x;
p
->
link
=
top;
top
=
p;
//
cout<<top->elements<<" ";
return
true
;
}
template
<
class
T
>
bool
LinkedStack
<
T
>
::Pop()
{
if
(IsEmpty())
{
//
空栈处理
cout
<<
"
Underflow
"
<<
endl;
return
false
;
}
Node
<
T
>*
p;
p
=
top
->
link;delete top;top
=
p;
return
true
;
}
template
<
class
T
>
void
LinkedStack
<
T
>
::Clear()
{
Node
<
T
>*
p
=
top;
while
(p)
{
p
=
top
->
link;
delete top;
top
=
p;
}
}
#include
<
iostream
>
#include
"
LinkedStack.h
"
using
namespace
std;
#include
<
ctype.h
>
#include
<
math.h
>
LinkedStack
<
float
>
s;
LinkedStack
<
char
>
cs;
int
isp(
char
optr)
{
switch
(optr)
{
case
'
=
'
:
return
0
;
case
'
(
'
:
return
1
;
case
'
^
'
:
return
7
;
case
'
*
'
:
return
5
;
case
'
/
'
:
return
5
;
case
'
%
'
:
return
5
;
case
'
+
'
:
return
3
;
case
'
-
'
:
return
3
;
case
'
)
'
:
return
8
;
default
:
return
0
;
}
}
int
icp(
char
optr)
{
switch
(optr)
{
case
'
=
'
:
return
0
;
case
'
(
'
:
return
8
;
case
'
^
'
:
return
6
;
case
'
*
'
:
return
4
;
case
'
/
'
:
return
4
;
case
'
%
'
:
return
4
;
case
'
+
'
:
return
2
;
case
'
-
'
:
return
2
;
case
'
)
'
:
return
1
;
default
:
return
0
;
}
}
void
DoOperator(
char
oper)
{
float
oper1,oper2;
oper1
=
s.Top();
s.Pop();
oper2
=
s.Top();
s.Pop();
switch
(oper)
{
case
'
+
'
:s.Push(oper2
+
oper1);
break
;
case
'
-
'
:s.Push(oper2
-
oper1);
break
;
case
'
*
'
:s.Push(oper2
*
oper1);
break
;
case
'
/
'
:s.Push(oper2
/
oper1);
break
;
case
'
^
'
:s.Push(pow(oper2,oper1));
break
;
}
}
void
Run()
{
char
c;
float
newop;
char
y;
cs.Push(
'
=
'
);
while
(cin
>>
c,c
!=
'
=
'
)
{
//
if(c!='+'&&c!='-'&&c!='*'&&c!='/')
if
(isdigit(c)
||
isalpha(c))
{
cin.putback(c);cin
>>
newop;
s.Push(newop);
}
else
if
(c
==
'
)
'
)
for
(y
=
cs.Top(),cs.Pop();y
!=
'
(
'
;y
=
cs.Top(),cs.Pop())
DoOperator(y);
else
{
for
(y
=
cs.Top(),cs.Pop();icp(c)
<=
isp(y);y
=
cs.Top(),cs.Pop())
DoOperator(y);
cs.Push(y);cs.Push(c);
}
}
while
(
!
cs.IsEmpty())
{
y
=
cs.Top();
cs.Pop();
if
(y
!=
'
=
'
)
DoOperator(y);
}
cout
<<
s.Top();
}
int
main()
{
Run();
}
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
树的非递归算法(第一次用手写的代码)
自己编的计算器类(使用自定义链式栈)
链式栈及用其测试的计算器
编写用链表实现的多项式的加法和乘法运算
初次使用栈编写的计算器
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 陈显锋
日历
<
2010年4月
>
日
一
二
三
四
五
六
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
c/c++(2)
非技术区(1)
封装
技术交流(4)
数据结构程序(5)
随笔档案
2012年5月 (2)
2012年4月 (3)
2012年3月 (3)
2010年4月 (6)
搜索
最新评论
1. re: 高斯约旦求矩阵的逆
这不是高斯约旦算法
--zhan