用栈实现括号匹配

原创 2018年04月17日 18:16:08

构造栈函数并用栈实现括号匹配

以下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//建立一个栈,用栈求出二进制转十进制,转八进制,销毁,清空,Push,Pop
//用栈来求逆波兰算法(用字符来转成双精度变量),用栈来检验括号是否正确
//建立一个链表栈,并具有插入,删除操作
#define INITNUM 20
#define INCREASENUM 5
typedef  char elem;
typedef struct Stack {
	elem* top;
	elem*base;
	int StackSize;
}sqStack;
void InitStack(sqStack*s) {
	s->base = (elem*)malloc(INITNUM*sizeof(elem));
	s->top = s->base;
	s->StackSize = INITNUM;
}
void Push(sqStack*s,elem e) {
	//添加数据时,当数据的大小超过预订值时,需要对整个链表的存储空间进行更改
	if (s->top - s->base >= s->StackSize) {
		s->base = (elem*)realloc(s->base, (s->StackSize + INCREASENUM) * sizeof(elem));
		s->top = s->base + s->StackSize;
		s->StackSize = s->StackSize + INCREASENUM;
		//StackSize发生改变
	}
	*(s->top) = e;
	s->top++;//把s的栈顶上移一位
}
//出栈,并获得出栈的数据
void Pop(sqStack*s, elem*e) {
	if (s->top == s->base)
		return;
	else {
		*e = *(--s->top);//对原来的e值进行改变
		//s->top下面的值才是要出栈的数据
	}
}
void ClearStack(sqStack*s) {
	s->top = s->base;//清空列表
}
int StackLen(sqStack*s) {
	return s->top - s->base;
	//获取当前链表长度
}
void DestroyStack(sqStack*s) {
	int len = INITNUM;
	for (int i = 0; i < len; i++) {
		free(s->base);
		s->base++;
		//其实就是把栈置空
	}
	s->base = s->top = 0;
	s->StackSize = 0;
}


//判断括号是否匹配的函数
int IsAlign(sqStack*s) {
	char c,temp=0;
	printf("请输入一系列括号,以回车键结束:");
	scanf("%c", &c);
	//scanf()输入字符时,键盘的缓冲空间为1,即读即存
	//而输入int型变量时,其空间大小为4个字节,需要回车后才能存储
	while (c != '\n') {
		switch (c)
		{
		case '{':
			Push(s, c);
			break;
		case '[':
			Push(s, c);
			break;
		case '(':
			Push(s, c);
			break;
		case ')':
			Pop(s, &temp);//把当时栈里的数出栈
			if (temp == '(')
				break;
			else
				return 0;
		case ']':
			Pop(s, &temp);
			if (temp == '[')
				break;
			else
				return 0;
		case '}':
			Pop(s, &temp);
			if (temp == '{')
				break;
			else
				return 0;
		default:
			break;
		}
		scanf("%c", &c);
	}
	if ((s->top != s->base) || !temp)//当没输入字符或只输入了半截括号时返回值为0
		return 0;
	return 1;
}
int main() {
	sqStack s;
	InitStack(&s);//一定要先进行初始化,否则base没有赋值空间
	if (IsAlign(&s))
		printf("匹配成功!\n");
	else
		printf("匹配失败!\n");
	return 0;
}

用C#实现封装

-
  • 1970年01月01日 08:00

数据结构之---C语言实现括号匹配(栈实现)

数据结构之---C语言实现括号匹配(栈实现)
  • u012965373
  • u012965373
  • 2015-09-13 20:50:58
  • 7532

栈用于解决括号匹配问题

在编写程序的过程中,我们经常需要对一串括号是否匹配进行判断。如何判断呢?我们可以借助栈来进行判断。基本思路是:遍历字符串,当发现有右括号而此时的栈顶元素又恰好是与之匹配的左括号时,则栈顶元素出栈;其余...
  • kelvinmao
  • kelvinmao
  • 2016-04-07 23:01:26
  • 1945

数据结构——栈实现括号匹配

数据结构——栈实现括号匹配 真正学习之后,才发现那些所谓的大婶不过是多用功了些。不知道以前为什么不亲自动手做做,原来这么简单。 #include #include #include ...
  • qq_29721419
  • qq_29721419
  • 2017-04-21 18:13:38
  • 428

链栈实现括号匹配

链栈实现括号匹配        数据结构中有一种结构叫做栈,它是一种先入后出的结构,通过这个程序的编写,基本上颠覆了我对于指针的认识,我才发现我对于c语言的指针并没有深入理解,我仅仅是对于一级指针有...
  • qq_32681843
  • qq_32681843
  • 2016-04-01 19:18:16
  • 984

用栈来实现 括号匹配

#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define ERROR 0#defi...
  • qq_34270992
  • qq_34270992
  • 2016-04-19 19:13:57
  • 435

C++实现栈的括号匹配

  • 2014年01月13日 09:01
  • 1.7MB
  • 下载

【数据结构】用栈实现括号匹配的检验

用栈实现括号匹配的检验.cpp #include #include using namespace std; typedef char SElemType; typedef struct {  S...
  • qq_32353771
  • qq_32353771
  • 2015-11-10 14:53:40
  • 4477

使用栈来演示括号匹配的算法

方法: void StrMacthByStack(string s) { stack left; while (!s.empty()) { ...
  • d06110902002
  • d06110902002
  • 2016-10-07 14:32:21
  • 386

利用栈实现括号匹配算法!

#include #include //malloc,realloc #include //含有overflow #include //exit() #define S_SIZE...
  • Sun19910114
  • Sun19910114
  • 2014-09-12 08:41:01
  • 2272
收藏助手
不良信息举报
您举报文章:用栈实现括号匹配
举报原因:
原因补充:

(最多只允许输入30个字)