【数据结构】【C语言】栈

名词解释

  • 先进后出

栈顶

  • 栈的开口端

栈底

  • 封口端

进栈,入栈,压栈

  • 向栈中添加元素

出栈,弹栈

  • 向栈中提取出指定元素

顺序栈

  • 采用顺序存储结构
  • 模拟栈存储数据的特点

链栈

  • 采用链式存储结构
  • 模拟栈存储数据的特点

顺序表栈

顺序表栈入栈

int push(int *a, int top, int elem)
{
	a[++top] = elem;
	return top;
}

顺序表栈出栈

int pop(int *a, int top)
{
	if(top == -1)
	{
		printf(空栈");
		return -1;
	}
	printf("弹栈元素:%d\n", a[top]);
	top--;
	return top;
}

实例

#include<stdio.h>

int push(int *a, int top, int elem)
{
    a[++top] = elem;
    return top;
}

int pop(int *a, int top)
{
    if(-1 == top)
    {
        printf("空栈");
        return -1;
    }

    printf("弹栈元素:%d\n", a[top]);
    top--;
    return top;
}

int main()
{
    int a[100];
    int top = -1;

    top = push(a, top, 1);
    top = push(a, top, 2);
    top = push(a, top, 3);
    top = push(a, top, 4);

    top = pop(a, top);
    top = pop(a, top);
    top = pop(a, top);
    top = pop(a, top);
    top = pop(a, top);

    return 0;
}

链栈

  • 入栈时,将数据从链表头部插入
  • 出栈时,删除链表数据的首元节点

链栈入栈

typedef struct lineStack
{
	int data;
	struct lineStack *next;
}lineStack;

lineStack *push(lineStack *stack, int a)
{
	lineStack *line = (lineStack *)malloc(sizeof(lineStack));
	line->data = a;
	line->next = stack;
	stack = line;
	
	return stack;
}

链栈出栈

typedef struct lineStack
{
	int data;
	struct lineStack *next;
}lineStack;

lineStack * pop(lineStack * stack)
{
	if(NULL == stack )
	{
		printf("栈内没有元素");
		return stack;
	}
	else
	{
		lineStack *temp = stack;

		stack = stack->next;
		printf("出栈元素:%d", temp->data);
		if(NULL == stack)
		{
			printf("栈已空\n");
		}
		else
		{
			printf("新栈顶元素:%d", stack->data);
		}
		free(temp);
	}
	
	return stack;
}

实例

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

typedef struct lineStack
{
    int data;
    struct lineStack *next;
}lineStack;

lineStack *push(lineStack * stack, int a)
{
    lineStack * line = (lineStack *)malloc(sizeof(lineStack));
    line->data = a;
    line->next = stack;

    stack = line;

    return stack;
}

lineStack *pop(lineStack * stack)
{
    if(NULL == stack)
    {
        printf("栈内没有元素\n");
        return stack;
    }
    else
    {
        lineStack * temp = stack;
        stack = stack->next;

        if(NULL == stack)
        {
            printf("栈已空\n");
        }
        else
        {
            printf("栈顶元素:%d", stack->data);
        }

        free(temp);
    }

    return stack;
}


int main()
{
    lineStack * stack = NULL;

    stack = push(stack, 1);
    stack = push(stack, 2);
    stack = push(stack, 3);
    stack = push(stack, 4);

    stack = pop(stack);
    stack = pop(stack);
    stack = pop(stack);
    stack = pop(stack);
    stack = pop(stack);


    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45117176/article/details/132031287