实验3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
栈的应用
1.实验目的:掌握栈的基本结构和操作方法,并能利用其解决实际问题。
2.实验内容:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,即([]())或[([][])]等都为正确的格式,而[(])为不正确的格式。利用栈编程序检验表达式中的括号是否合法。
3.提示:
(1)先实现栈的基本操作:初始化,入栈,出栈等。
(2)每读入一个括号,若是右括号,则或者是置于栈顶的左括号得以消解,或者是不合法的情况;若是左括号,则直接入栈。
(3)用顺序栈实现。
-----
代码
//---code.h
#define TRUE 1
#define FALSE 0
#define ok 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NULL 0
typedef int Status;
///---顺序栈test.cpp
#include "code.h"
#include
#include
#include
#include
#define STACK_SIZE 100 /* 栈初始向量大小*/
#define STACKINCREMENT 10
typedef char ElemType ;
typedef struct sqstack
{
ElemType *base; /* 栈不存在时值为NULL */
ElemType *top; /* 栈顶指针*/
int stacksize ; /* 当前已分配空间,以元素为单位*/
}SqStack ;
Status InitStack(SqStack &s)
{
// ElemType *a=(ElemType *)malloc(10*sizeof(ElemType));
//realloc(a,STACK_SIZE *sizeof(ElemType));
s.base=(ElemType *)malloc(STACK_SIZE *sizeof(ElemType));
if (! s.base) return ERROR;
s.top=s.base ; /* 栈空时栈顶和栈底指针相同*/
s.stacksize=STACK_SIZE;
return ok ;
}
Status push(SqStack &S,ElemType e)
{
if (S.top-S.base>=S.stacksize)
{
return ERROR;
}
*S.top=e;
S.top++ ; /* 栈顶指针加1,e成为新的栈顶*/
return ok;
}
Status pop( SqStack &S, ElemType &e )
{
if ( S.top== S.base )
return ERROR ; /* 栈空,返回失败标志*/ S.top-- ;
e=*S.top ;
return ok ;
}
int stackLength( SqStack S )
{
return S.top-S.base ;
}
Status StackEmpty( SqStack &S)
{
if ( S.top== S.base )
return TRUE;
else
return FALSE;
}
void static main()
{
char ch ,x ;
SqStack S;
InitStack(S);
scanf("%c", &ch) ;
while((int)ch!=10)//enter回车的ASC为10 {
if ((ch=='(')||(ch=='['))
push(S, ch) ;
else if (ch==']')
{
pop(S,x) ;
if (x!='[')
{
printf("'['括号不匹配") ;
return ;
}
}
else if (ch==')')
{
pop(S,x) ;
if (x!='(')
{
printf("'('括号不匹配") ;
return ;
}
}
scanf("%c", &ch) ;
}
if (!StackEmpty(S))
{
printf("括号数量不匹配!") ;
return ;
}
else
printf("括号数量匹配成功!") ;
}