C数据结构-栈

栈 : 在表尾进行删除和插入操作的线性表

typedef int SElemType;

typedef struct
{
        SElemType data[MAXSIZE];
        int top;
}SqStack;

Status Push(SqStack *S,SElemType e)
{
        if(S->top == MAXSIZE -1)
                return ERROR;
        S->top++;
        S->data[S->top] = e;
        return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
        if(S->top == MAXSIZE -1 )
                return ERROR;

        *e = S->data[S->top];

        S->top--;
        return OK;
}


对于两个相同类型的栈,我们可以做到最大限度地利用事先开辟的存储空间来进行操作
关键思路:他们在数组的两端,向中间靠拢。top1和top2是栈1和栈2的栈顶指针,top1 + 1 = top2时为栈满。

typedef struct
{
        SElemType data[MAXSIZE];
        int top1;
        int top2;

}SqDoubleStack;

Status Push(SqDouble *S,SElemType e,int stackNumber)
{
        if(S->top1 + 1 == S->top2)
                return ERROR;

        if(stackNUmber == 1)
                S->data[++S->top1] = e;
        else if(stackNumber == 2)
                S->data[--S->top2] = e;

        return OK;
}
Status Pop(SqDoubleStack *S,SElemType *e,int stackNUmber)
{
        if(stackNumber == 1)
        {
                if(S->top1 == -1)
                        return ERROR;
                *e = S->data[S->top--];
        }
        else if(stackNumber == 2)
        {
                if(S->top2 == MAXSZIE)
                        return ERROR;
                *e = S->data[S->top++];
        }
}


栈的链式存储结构
对于链栈来说,是不需要头结点的,链栈的空其实就是top = NULL;

链栈的结构

typedef struct StackNode
{
        SElemType data;
        struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct LinkStack
{
        LinkStackPtr top;
        int count;
}LinkStack;

进栈操作

Status Push(LinkStack *S,SElemType e)
{
        LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
        s->data = e;
        s->next = S->top;
        S->top = s;
        S->count++;
        return OK;
}
出栈操作
Status Pop(LinkStack *S,SElemType *e)
{
        LinkStackPtr p;
        if(StackEmpty(*S))
                return ERROR;

        *e = S->top->data;
        p = S->top;
        S->top = S->top->next;
        free(p);
        S->count --;
        return OK;
}

用栈来实现表达式中(),[],{}是否匹配

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_MAX_SIZE 50

typedef struct STACK{
	char databuf[STACK_MAX_SIZE];
	int top;
}STACK;
typedef struct STACK stack;

void initstack(stack *s)
{
	s->top = -1;
}
char push(stack *s,char a)
{
	if(s->top == STACK_MAX_SIZE - 1)
		return 0;
	s->top++;
	s->databuf[s->top] = a;
	return a;
}

char pop(stack *s)
{
	if(s->top == -1)
		return 0;
	char a = s->databuf[s->top];
	s->top --;
	return a;
}

int empty(stack *s)
{
	if(s->top == -1)
		return 1;
	else
		return 0;
}
int check(char *str)
{
	stack s;
	initstack(&s);
	int num = strlen(str);
	int i,sig;
	sig = 0;//
	for(i = 0;i<num;i++)
	{
		char a=str[i];
		int ret;
		switch(a)
		{
			case '{':
			case '[':
			case '(':
				sig++;		
				push(&s,a);
				break;
			case '}':
				if(pop(&s) != '{')
				{
					return 0;
				}
				break;
			case ']':
				if(pop(&s) != '[')
				{
					return 0;
				}
				break;
			case ')':
				if(pop(&s) != '(')
				{
					return 0;
				}
				break;
		
		}
	
	}
	int ret = 0;
	ret = empty(&s);
	if(ret == 1 && sig == 0)
		return 2;//empty
	else if(ret == 1)
		return 1;
	else
		return 0;
}


void main()
{
	char str[100];
	scanf("%s",str);
	int ret;
	ret = check(str);
	if(ret == 2)
		printf("no []{}()\n");
	else if(ret == 1)
		printf("match \n");
	else
		printf("not match\n");

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为了维护世界和平_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值