解决问题的核心步骤

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

解决问题的核心步骤:

1、构造一个20字节的栈,不够再10个10个地追加

2、从第一个字符开始检查,遇到左括号,进栈,遇见右括号时检查栈顶元素是

否与之相匹配,是则弹出栈顶元素;否,则返回0

程序构造思想

主程序模块

char main(){

定义变量

定义指向栈的指针

读入字符串

调用Match()函数

}

栈的初始化

InitStack(){

创建一个可以存储20个字节的栈

若创建失败,退出

}

压栈

PushStack(){

判断栈是否栈满,栈满,追加

若存储分配失败,退出

e赋值给top所指向的单元

top向上移一位

}

获取栈顶元素

GetTop(){

返回top-1所指单元的值

}

匹配函数

Match(){

for{

从首字符开始判断

遇到左括号,进栈

遇到右括号,和栈顶字符比较,与之匹配,栈顶元素弹栈遇到不匹配的右括号,提示配对失败

}

返回r值(bool函数)

}

程序源代码

#include

#include

#include

#include

#include

using namespace std;

#define STACK_INIT_SIZE 20

#define STACKINCREMENT 10

//类型说明

typedef struct {

char * base; //设置栈底指针

char * top; //设置栈顶指针

int stacksize;

}SqStack;

//构造一个栈S

void InitStack(SqStack *S){

S->base = (char *) malloc (STACK_INIT_SIZE ); //分配可以放得下个整数的内存空间。

if(!S->base) exit (0); //存储分配失败

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

}

//插入新的栈顶元素e

void Push(SqStack *S,char e){

if(S->top - S->base >=S->stacksize)

{//栈满,追加存储空间

S->base =(char * )realloc(S->base,

(S->stacksize + STACKINCREMENT));

if(!S->base) exit (0); //存储分配失败

S->top =S->base +S->stacksize ;

S->stacksize +=STACKINCREMENT;

}

* S->top=e;

S->top++;

}

//获取栈顶元素

char GetTop(SqStack *S){

if(S->top==S->base ) return 0;

return *(S->top - 1);

}

//弹出栈顶元素e

char Pop(SqStack *S){

if(S->top==S->base ) return 0;//栈空,返回ERROR return *(--S->top); //栈不空,用e返回栈顶元素}

//栈空

int Empty(SqStack *S){

if(S->base ==S->top) return 1;

else return 0;

}

//匹配函数

bool Match(char c[40], SqStack *S){

int i;

bool r = true;

InitStack(S);

for(i=0;i<20;i++){ //从首元素开始判断

if(c[i]&&(c[i]=='('||c[i]=='[')){//是否为左括号,

Push(S,c[i]); //是,进栈

cout<<"Push a parenthesis "<

stack!"<

}

else if(c[i]&&c[i]==')'){ //是否为右括号

if(GetTop(S)&&GetTop(S)=='('){//是,判断前一括号是否为与之相对的括号

Pop(S); //是,弹栈

cout<<"Success to match one pair of parenthesis ( ) "<

}

else {cout<<"Fail to match a pair of parenthesis( )"<

r=false;

}

}

else if(c[i]&&c[i]==']'){ //是否为右括号

if(GetTop(S)&&GetTop(S)=='['){//是,判断前一括号是否为与之相对的括号

Pop(S); //是,弹栈

cout<<"Success to match one pair of parenthesis[ ] " << endl;

}

else{cout<<"Fail to match a pair of parenthesis[ ]"<

r = false;

}

}

}

return r;

}

相关文档
最新文档