C数据结构-栈

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");


以上是关于C数据结构-栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 栈和队列 算法设计Demo1

[C语言学习笔记]--动态内存管理

堆/栈的比较 以及 malloc/new动态内存的开辟

深入理解C语言从函数栈帧角度理解return关键字

C语言程序栈堆的问题

使用callstack在C中实现栈数据结构?