栈及其应用

一、题目

设计并验证以下算法:设一个算术表达式中包含圆括号、方括号和花括号,判断其中的括号是否匹配。
(1) 算术表达式中可以包含三种括号“(”和“)”、“[”和“]”、“{”和“}”,并且这三种括号可以按任意的次序嵌套使用。比如,…[…{…}[…]]…(…)…。
(2) 设置一个运算符栈OPTR。当遇到的‘(’、‘[’或‘{’时进栈;当遇到‘(’、‘[’或‘{’时,判断栈顶是否为相应的括号,若是则退栈继续执行,否则提示出错并结束。
(3) 要求由键盘输入包括‘(’、‘[’或‘{’的算术表达式。

代码如下:

#include <stdio.h>
#include<stdlib.h>
#include <string.h>

#define ARRAY_SIZE 100//数组容量 
#define STACK_INIT_SIZE 10//栈空间的初始分配量
#define STACKSIZE 10//栈空间的增量 
typedef struct{//字符栈 
	char *top;//栈顶 
	char *base;//栈底 
	int size;//栈的容量 
}signstack;
int InitStack(signstack* s){//初始化栈 
	s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
	s->top=s->base;
	s->size=10;
	return 1; 
}
int Push(signstack* s,char elem){//进栈 
	if(s->top-s->base >= s->size){
		s->base=(char*)realloc(s->base,(s->size+STACKSIZE)*sizeof(char));
		s->top=s->base+s->size;
		s->size+=STACKSIZE;
	}
	*(s->top)=elem;
	s->top++;
}
int Pop(signstack* s){//出栈 
	if(s->top==s->base)
	return 0;
	s->top--;
	return 1;
}
int IsSign(char c){//是否为括号 
	if(c=='('||c==')'||c=='['||c==']'||c=='{'||c=='}'||c=='#')
	return 1;
	else 
	return 0;
}
int IsLeftSign(char c){//是否为括号 
	if(c=='('||c=='{'||c=='[')
	return 1;
	else 
	return 0;
}
bool IsEmpty(signstack* s){//判断栈是否为空 
	if(s->base==s->top)
	return true;
	else
	return false;
}
char GetTop(signstack *s)//获取栈顶元素 
{
	if(!IsEmpty(s))
	{
		char*temp=s->top;
		temp--;
		return *(temp);
	}
	else return ' ';
}
bool Compare(signstack* s,char b){//匹配是否相同
	char a=GetTop(s);
	if(a=='{'&&b=='}'||a=='['&&b==']'||a=='('&&b==')'||a=='#'&&b=='#')
	return true;
	else
	return false;
}
void Output(signstack* s)
{
	char* p=s->base; 
	for(;p<s->top;p++)
	{
		printf("%c ",*p);
	}
	printf("\n");
}
int main(){
	char str[ARRAY_SIZE];
	signstack sign;
	InitStack(&sign);
	gets(str);
	int lenth=strlen(str);
	str[lenth]='#';//在末尾加上# 
	Push(&sign,'#');
	int i=0;
	for(int i=0;i<=lenth+1;i++){
		if(IsSign(str[i])){//是括号字符
			if(IsLeftSign(str[i])){
				Push(&sign,str[i]);//进栈
			}
			else{
				if(!Compare(&sign,str[i])){//不匹配
					Push(&sign,str[i]);//进栈 
				}
				else{//匹配 
					Pop(&sign);//出栈 
				}
			}
		}
		Output(&sign);
	}
	if(IsEmpty(&sign)){
		printf("匹配成功");
	}
	else
	printf("匹配失败"); 
	
	return 0;
}

2.读入数据


不断输出栈内的剩余内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值