第六周 项目3-括号的匹配
2015-10-12 16:22
302 查看
/*
*Copyright(c) 2015, 烟台大学计算机学院
*All rights reserved.
*文件名称:括号的匹配.cpp
*作 者:周洁
*完成日期:2015年 10月16日
*版 本 号:
*
*问题描述:假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。
例如,输入2+(3+4)*[2+{[3]}]-8,输出匹配正确;输入2+(3+4*[2)+{[3]}-8,输出匹配错误。
提示:(1)遇到左括号入栈,遇到右括号后,出栈一个符号,看是否配对。若配对,继续,直到读完所有的符号,栈也正好为空。若在中间出现一个不配对的,或者[b]_____________[/b],则可以得出不配对的结论。(2)也可以设计一个返回值为布尔型的函数,参数为要配对的表达式,为一个字符串。
*输入描述: 输入表达式
*程序输出: “匹配正确”或“匹配错误”
*/
代码:
(1)头文件 s.h
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int top; //栈指针
} SqStack; //顺序栈类型定义
void InitStack(SqStack *&s); //初始化栈
void DestroyStack(SqStack *&s); //销毁栈
bool StackEmpty(SqStack *s); //栈是否为空
int StackLength(SqStack *s); //返回栈中元素个数——栈长度
bool Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
void DispStack(SqStack *s); //输出栈
#endif // SQSTACK_H_INCLUDED
(2)源文件 s.cpp
#include <stdio.h>
#include <malloc.h>
#include "s.h"
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top];
s->top--;
return true;
}
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
int main()
{
char c;
char st[50];
int d=1, i;
SqStack *s;
InitStack(s);
printf("请输入表达式:");
scanf("%s", st);
for(i=0; st[i]!='\0'&&d; i++)
{
switch(st[i])
{
case'(':
case'[':
case'{':
Push(s, st[i]);
break;
case')':
Pop(s, c);
if(c!='(') d=0;
break;
case']':
Pop(s, c);
if(c!='[') d=0;
break;
case'}':
Pop(s,c);
if(c!='{') d=0;
break;
}
}
if(StackEmpty(s)&&d==1)
printf("配对正确!!\n");
else
printf("配对错误!!\n");
return 0;
}
运行结果:
知识点总结:
栈的应用,入栈和出栈。
*Copyright(c) 2015, 烟台大学计算机学院
*All rights reserved.
*文件名称:括号的匹配.cpp
*作 者:周洁
*完成日期:2015年 10月16日
*版 本 号:
*
*问题描述:假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。
例如,输入2+(3+4)*[2+{[3]}]-8,输出匹配正确;输入2+(3+4*[2)+{[3]}-8,输出匹配错误。
提示:(1)遇到左括号入栈,遇到右括号后,出栈一个符号,看是否配对。若配对,继续,直到读完所有的符号,栈也正好为空。若在中间出现一个不配对的,或者[b]_____________[/b],则可以得出不配对的结论。(2)也可以设计一个返回值为布尔型的函数,参数为要配对的表达式,为一个字符串。
*输入描述: 输入表达式
*程序输出: “匹配正确”或“匹配错误”
*/
代码:
(1)头文件 s.h
#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int top; //栈指针
} SqStack; //顺序栈类型定义
void InitStack(SqStack *&s); //初始化栈
void DestroyStack(SqStack *&s); //销毁栈
bool StackEmpty(SqStack *s); //栈是否为空
int StackLength(SqStack *s); //返回栈中元素个数——栈长度
bool Push(SqStack *&s,ElemType e); //入栈
bool Pop(SqStack *&s,ElemType &e); //出栈
bool GetTop(SqStack *s,ElemType &e); //取栈顶数据元素
void DispStack(SqStack *s); //输出栈
#endif // SQSTACK_H_INCLUDED
(2)源文件 s.cpp
#include <stdio.h>
#include <malloc.h>
#include "s.h"
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top];
s->top--;
return true;
}
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
int main()
{
char c;
char st[50];
int d=1, i;
SqStack *s;
InitStack(s);
printf("请输入表达式:");
scanf("%s", st);
for(i=0; st[i]!='\0'&&d; i++)
{
switch(st[i])
{
case'(':
case'[':
case'{':
Push(s, st[i]);
break;
case')':
Pop(s, c);
if(c!='(') d=0;
break;
case']':
Pop(s, c);
if(c!='[') d=0;
break;
case'}':
Pop(s,c);
if(c!='{') d=0;
break;
}
}
if(StackEmpty(s)&&d==1)
printf("配对正确!!\n");
else
printf("配对错误!!\n");
return 0;
}
运行结果:
知识点总结:
栈的应用,入栈和出栈。
相关文章推荐
- 能挣钱的微信JSSDK+H5混合开发
- Shiro的Realm
- 优秀网站收集
- 第4周项目3 单链表的应用(3)
- 第四周项目2—建设“单链表”算法库
- ViewPager 的 PagerIndicator
- 关于操作栏actionBar的添加移除总结
- 【日常学习】【二分】【最长不下降子序列长度】codevs4214 [Mz]品尝美食题解
- linux命令行快捷键
- Linux基础(二)fork()进程
- Android Studio系列教程四--Gradle基础
- 输入流和输出流同时操作一个文件的问题
- 源码安装postgresql
- Android中UID机制和共享进程
- 测试工作--一年总结
- 如何将Nios II硬件和软件合成一个文件(NIOS II)(硬件)(软件)(合并)
- ListView、ScrollView中嵌套的EditText不能滚动的问题
- linux备忘
- vijosP1359 Superprime
- linux 安装rz sz