括号匹配问题 栈c语言流程图,c++利用顺序栈解决括号匹配问题

给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。

输入格式:

输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。

输出格式:

如果括号配对,输出yes,否则输出no。

输入样例1:

sin(10+20)

输出样例1:

yes

输入样例2:

{[}]

输出样例2:

no

分析:

通过详读题目以及例题我们可以知道:程序会读入随机输入的一串字符串,而当只有 ‘(‘和‘)‘ 、‘[‘和‘]‘ 、 ‘{‘和‘}‘相匹配的时候输出“yes”,其他情况都会输出“no”。

这时候我们可以采用顺序栈的结构来解决这一个问题:

将所有的左括号(即" ( 、[ 、{ ")存入栈中,遇到右括号(即" )、]、}")时出栈,再判断两者是否匹配。

代码:

#include

#include

using namespace std;

//定义栈

#define max_size 200//栈的最大容量

typedef char datatype;

typedef struct{

datatype zhan[max_size];

int top;//栈顶

}stack;

//栈的初始化

void initial(stack &st)

{

st.top = 0;

}

//类型为datatype的x入栈

void push(stack &st, datatype x)

{

//当栈顶和max_size相等时,栈满

if(st.top == max_size){

// cout<

cout<

exit(0);

}else{

st.zhan[st.top] = x;

st.top++;

}

}

//出栈

char pop(stack &st){

if(st.top == 0){

// cout<

cout<

exit(0);

}else{

st.top--;

return st.zhan[st.top];

}

}

int main(){

stack s;

initial(s);

/*输入字符串,并将字符串放到字符数组中,

实现能够逐个扫描字符串中的字符,并且不跳过空格符

*/

string str;

getline(cin, str);

char ch[200]={‘\0‘};

strcpy(ch,str.c_str());

//flag标志状态 1为括号匹配,0为不匹配

int flag=1;

int i;

for(i=0; ch[i]!=‘\0‘; i++){

//元素若为{,(,[则入栈

if((ch[i] == ‘{‘ )|| (ch[i] ==‘[‘) || (ch[i] ==‘(‘)){

push(s, ch[i]);

}//元素若为},),]则出栈 赋值给a

else if((ch[i] == ‘}‘) || (ch[i] ==‘]‘) || (ch[i] ==‘)‘)){

char a;

a = pop(s);

//若a与ch[i]匹配,进行下一个字符扫描

if((a == ‘{‘ && ch[i] == ‘}‘) || (a == ‘(‘ && ch[i] == ‘)‘) || (a == ‘[‘ && ch[i] == ‘]‘)){

continue;

}else flag = 0;

}

}

if(s.top != 0){

flag = 0;

}

if(flag == 0){

cout<

}else cout<

return 0;

}

编程过程中遇到的问题:

1.  在对字符串进行入栈操作时s.top(栈顶)的数值不增加,总为1

错误代码如下:

ae76fd02863f556a222d243d74fb4580.png

运行结果如下:

487a0374d74b481f35d14a24d3a611f3.png

这段代码对于初学者来说看上去逻辑和操作过程似乎都没有问题,同时也困扰了我许久,

在参考了《数据结构(c语言版)》李云清等编著的教程后,我发现我犯了一个致命的低级错误:

编程push函数的时候,传入的参数为 stack st ,是不具有返回的功能,也就意味着在 push 函数中对于 st.top++ 这个操作没有更改主函数中st.top的数值。

修改代码如下:

将传入的参数为 stack st 改为 => 传入的参数为 stack &st,

当然,将它写成具有返回值的函数或者传入指针也是可行的。

0105e52773dd208d94f7066d1f33cc31.png

2.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值