栈的基本功能和用栈解决括号匹配问题

栈的基本原理很简单,先进后出。简单来说,栈是一个操作受限的线性结构,一共四个功能:

  • 入栈(push)
  • 判断栈满(isFull)
  • 出栈(pop)
  • 判断栈空(isEmpty)
    栈是一个操作受限的线性表,而线性表呢,主要有两种:
  • 顺序存储的数组
    优点:操作简单,节省空间
    缺点:栈的大小一开始就声明“死”了,不利于使用
  • 非顺序存储的链表
    优缺点和顺序存储数组恰恰相反
    数组栈
    把数组强大的下标功能给割腌掉,只能在头一个头进,头一个头出。
  • 创建一个结构体
typedef struct node
{
	int data[Maxsize];
	int topIdx;
}SeqStack;
  • push操作
int push(SeqStack &l,int e)
{
	if(l.topIdx==Maxsize-1)
	{
		return 0;
	}
	l.data[l.topIdx++]=e;
	return e;
}
  • pop操作
int pop(SeqStack &l)
{
	if(l.topIdx==0)
	{
		return 0;
	}
	int val;
	val=l.data[--l.topIdx];
	return val;
}
  • 判空操作
int isEmpty(SeqStack s)
{
	if(s.topIdx!=0)
	{
		return 1;
	}
	else
		return 0;
}
  • 判满操作
int isFull(SeqStack s)
{
	if(s.topIdx==Maxsize-1)
	{
		return 0;
	}
	else
		return 1;
}

用栈来判断括号匹配问题

#include
#include
#include
#define Maxsize 50
using namespace std;
typedef char datatype;
typedef struct 
{
	datatype data[Maxsize];
	int top;
}SeqStack;
void initStack(SeqStack *s)
{
	s->top=-1;
}
int isEmpty(SeqStack *s)
{
	if(s->top==-1)
		return 0;
	else
		return 1;
}
int push(SeqStack *s,datatype x)
{
	if(s->top==Maxsize-1)
		return 0;
	else
	{
		s->data[++(s->top)]=x;
		return 1;
	}
}
int pop(SeqStack *s,datatype *x)
{
	if(s->top==-1)
		return 0;
	else
	{
		*x=s->data[(s->top)--];
		return 1;
	}
}
int text(SeqStack *S,char *str)
{
	initStack(S);
	int i=0;
	char e;
	while(str[i]!='\0')
	{
		switch(str[i]){
		case '(':
			push(S,'(');
			break;
		case '[':
			push(S,'[');
			break;
		case'{':
			push(S,'{');
			break;
		case ')':
			pop(S,&e);
			if(e!='(')
				return 0;
			break;
		case ']':
			pop(S,&e);
			if(e!='[')
				return 0;
			break;
		case '}':
			pop(S,&e);
			if(e!='{')
				return 0;
			break;
		default:
			break;
		}
		i++;
	}
	int h=isEmpty(S);
	if(h==1)
		return 0;
	else
		return 1;
}
int main()
{
	SeqStack S;
	char str[Maxsize];
	printf("put into the chars\n");
	scanf("%s",str);
	int h;
	h=text(&S,str);
	if(h==0)
		printf("wrong\n");
	else
		printf("right\n");
	return 0;
}

			

你可能感兴趣的:(数据结构与算法)