数据结构 P49 栈的应用举例-括号匹配的检验

本文介绍了一种使用顺序栈实现括号匹配的方法,并详细展示了如何通过C++编程语言实现该算法。文中包括了栈的基本操作如初始化、入栈、出栈等,以及通过实例演示如何进行括号匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include<conio.h>


using namespace std;
#define STACK_INIT_SIZE 100     //初始存储容量
#define  STACKINCERMENT 10   //存储空间增量


struct SqStack                    //顺序栈的定义
{
char *base;                        //栈底指针
char *top;                          //栈顶指针
int stacksize;                   //当前最大容量
};


bool InitStack(SqStack &S)                     //构造一个空栈
{
S.base=new char [STACK_INIT_SIZE];     //先给空栈分配一个初始空间
if(!S.base) return 0;                              //分配失败则返回0
S.top=S.base;                                      //栈顶指针初值指向栈底指针,代表空栈
S.stacksize=STACK_INIT_SIZE;             //赋予栈当前的最大容量值
return 1;
}


int GetTop(SqStack S,char &e)                         //若栈不空,则用e返回S的栈顶元素
{
if(S.top==S.base)     return 0;          //如果栈为空,则返回0
e=*(S.top-1);                                   //如果栈不为空,则用e返回栈顶元素
return e;
}


bool Push(SqStack &S,char e)                  //插入元素e为新的栈顶元素
{
if(S.top-S.base>S.stacksize)           //如果栈满,则给栈追加存储空间
{
S.base=new char[STACKINCERMENT];
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCERMENT;
}
if(!S.base) return 0;                        //如果分配失败,则返回0
*S.top=e;                                      //把e的值赋给栈顶指针  ,可合并为 *S.top++=e;    (++运算级高于*)
++S.top;                                      //栈顶指针地址加一    
return 1;
}


bool Pop(SqStack &S)                      //若栈不空,则删除S的栈顶元素
{                                     
if(S.top==S.base)                         //若栈为空,返回0
return 0;
*(--S.top)=NULL;                                //把栈顶指针指向的值赋给e
return 1;
}


void kuohao(SqStack &S)             //括号匹配检验
{//1
int i=0;                                     //定义i,用于体现出错括号所在的位数
char ch=NULL,ch1=NULL;       //定义两个char型变量
while(ch!='s')                            //当ch不为‘s’时循环不停止
{//2
cin>>ch;                              //输入字符
++i;                                      // i加一
switch(ch)
 {//3
   case ']':                                //当输入的字符为']'时,检验栈顶元素是否为'['
   GetTop(S,ch1);
if(ch1=='[')                      //是,删除当前栈顶元素
   Pop(S);
else                                 //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case')':                                 //当输入的字符为')'时,检验栈顶元素是否为'('
GetTop(S,ch1);
if(ch1=='(')                     //是,删除当前栈顶元素
   Pop(S);
else                                 //不是,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
case'[':                               //当输入的字符为'['时,压入栈顶
Push(S,ch);
break;
case'(':                              //当输入的字符为'('时,压入栈顶
Push(S,ch);
break;
default:                              //当输入的字符为其他时,报错
cout<<i<<":"<<ch<<"<-error"<<endl;
break;
}//3
}//2
}//1
int main()
{
SqStack s;                                  //定义一个栈s
InitStack(s);                                //初始化栈
kuohao(s);


while(1){}
delete [] s.base;
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值