别国军的博客
水手在大海
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章档案
2008年7月 (4)
搜索
最新评论
Powered by:
博客园
模板提供:
沪江博客
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
栈操作的几个例子
以下是我写的几个栈操作的例子,仅供参考,分别是数制转换(将十进制数转换为替他d进制数),括号匹配的检查,表达式求值等。
//头文件SqStack.h
#include
<
stdio.h
>
#include
<
malloc.h
>
#define
STACK_INIT_SIZE 100
#define
STACKINCREMENT 10
#define
TRUE true
#define
FALSE false
//
typedef int ElemType;
typedef
char
ElemType;
//
视情况选择
#define
ERROR printf("Fail!\n")
#define
SUCCESS printf("Success!\n")
#define
DEBUG_
class
SqStack
{
public
:
ElemType
*
base
;
ElemType
*
top;
int
stackSize;
public
:
bool
InitStack();
bool
Push(ElemType e);
bool
Pop(ElemType
&
e);
bool
IsEmpty()
{
return
this
->
base
==
this
->
top;
}
}
;
bool
SqStack::InitStack()
{
this
->
base
=
(ElemType
*
)malloc(STACK_INIT_SIZE
*
sizeof
(ElemType));
if
(
!
this
->
base
)
{
printf(
"
Error!
"
);
return
FALSE;
}
this
->
top
=
this
->
base
;
this
->
stackSize
=
STACK_INIT_SIZE;
return
TRUE;
}
bool
SqStack::Push(ElemType e)
{
if
(
this
->
top
-
this
->
base
>=
this
->
stackSize)
{
this
->
base
=
(ElemType
*
)malloc(
(STACK_INIT_SIZE
+
STACKINCREMENT)
*
sizeof
(ElemType));
if
(
!
this
->
base
)
return
FALSE;
this
->
top
=
this
->
base
+
this
->
stackSize;
this
->
stackSize
+=
STACKINCREMENT;
}
*
(
this
->
top
++
)
=
e;
return
TRUE;
}
bool
SqStack::Pop(ElemType
&
e)
{
if
(
this
->
top
==
this
->
base
)
return
FALSE;
e
=
*
(
--
this
->
top);
return
TRUE;
}
1.数制转换 convert.cpp
#include "SqStack.h"
void
convert()
{
unsigned
int
N;
ElemType e;
SqStack stack;
stack.InitStack();
printf(
"
please input:
"
);
scanf(
"
%d
"
,
&
N);
while
(N)
{
stack.Push(N
%
8
);
N
=
N
/
8
;
}
while
(stack.
base
!=
stack.top)
{
stack.Pop(e);
printf(
"
%d
"
, e);
}
printf(
"
\n
"
);
}
void
main()
{
convert();
}
2.括号匹配检查 test.cpp
#include "SqStack.h"
bool
compatible(ElemType a, ElemType b)
{
return
a
==
'
)
'
&&
b
==
'
(
'
||
a
==
'
(
'
&&
b
==
'
)
'
||
a
==
'
]
'
&&
b
==
'
[
'
||
a
==
'
[
'
&&
b
==
'
]
'
||
a
==
'
}
'
&&
b
==
'
{
'
||
a
==
'
{
'
&&
b
==
'
}
'
;
}
void
test()
{
ElemType e;
char
*
s
=
new
char
[STACK_INIT_SIZE];
printf(
"
Input the string to test with '(', ')', '[', ']':
"
);
gets(s);
SqStack strStack;
if
(
!
strStack.InitStack())
{
#ifdef DEBUG_
printf(
"
Stack initialize fail!\n
"
);
#endif
ERROR;
}
while
(
*
s
!=
'
\0
'
)
{
strStack.Push(
*
s);
s
++
;
if
(
!
compatible(
*
(strStack.top
-
1
),
*
(strStack.top
-
2
)))
{
if
(
*
s
==
'
\0
'
)
return
;
strStack.Push(
*
s);
s
++
;
}
while
(compatible(
*
(strStack.top
-
1
),
*
(strStack.top
-
2
)))
{
strStack.Pop(e);
strStack.Pop(e);
}
}
if
(strStack.IsEmpty())
{
SUCCESS;
}
else
ERROR;
}
void
main()
{
test();
}
说明:例如,({}[])是合法格式,而[](]为不正确的格式
发表于 2008-07-18 12:50
水手
阅读(101)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理