基本概念

栈是一种只能在一端进行插入和删除操作的线性表

入栈和出栈的顺序规律Python 入栈和出栈的代码_算法

允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。当栈中没有元素时,称为空栈。栈的插入操作称为进栈或入栈;栈的删除操作称为退栈或出栈

栈是先进后出的线性表,即先进展的元素先出栈,比如一个狭窄(只有一个人宽度)的死胡同就类似一个栈,先进去的人只能等最后才能出,这就是先进后出。

一个栈应该包括数据部分和栈顶指针,数据部分用来存放数据,栈顶指针用来始终指向栈顶。空栈时,栈顶指针指向-1;当发生入栈时,先栈顶指针加一指向一个新的元素空间,然后将数据放入栈顶指针指向的这个空间;当发生出栈时,先将栈顶指针指向的数据读出,然后将栈顶指针减一。

代码

stack.c

#include "stack.h"

/*********************栈的顺序存储结构******************************/
void InitStack(SqStack& s)//初始化一个空栈
{
	s = (SqStack)malloc(sizeof(SStkNode));
	s->top = -1;  //栈顶指向-1表示空栈,栈顶始终指向栈顶元素
}

void DestroyStack(SqStack& s)
{
	free(s);//释放栈
}

bool StackEmpty(SqStack& s)
{
	return (s->top == -1);//栈顶指向-1表示空栈
}

status Push(SqStack& s, ElemeType_SStk e)//入栈操作,只需要把数据传递进去就行了,不需要引用
{
	if (s->top == (MaxSize_SStk - 1))return ERROR;
	s->top ++;
	s->data[s->top] = e;
	return OK;
}


status Pop(SqStack& s, ElemeType_SStk& e)//数据引用,以便把数据传递出去
{
	if (s->top == -1)return ERROR;
	e = s->data[s->top];
	s->top--;
	return OK;
}

bool GetTpo(SqStack& s, ElemeType_SStk& e)//取栈顶元素,
{
	if (s->top == -1)return false;//栈下溢出
	e = s->data[s->top];   //只取出栈顶元素,但并不退栈
	return true;
}

stack.h

#ifndef _INC_STACK
#define _INC_STACK

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

#define ERROR 0
#define OK 1

#define ElemeType_SStk int
#define MaxSize_SStk 100 //栈最大容量

typedef int status;

typedef struct  //定义栈结构
{
	ElemeType_SStk data[MaxSize_SStk];
	int top;   //栈顶指针
}SStkNode,*SqStack;

/*********************栈的顺序存储结构******************************/
void InitStack(SqStack& s);//初始化一个空栈
void DestroyStack(SqStack& s);
bool StackEmpty(SqStack& s);
status Push(SqStack& s, ElemeType_SStk e);//入栈操作,只需要把数据传递进去就行了,不需要引用
status Pop(SqStack& s, ElemeType_SStk& e);//数据引用,以便把数据传递出去
bool GetTpo(SqStack& s, ElemeType_SStk& e);//取栈顶元素,

/*********************栈的链式存储结构******************************/

#endif

测试试一下吧-判断字符串是否对称

算法思路:先将字符串入栈,然后出栈时一个一个和字符串对比,如果全部相同则表示对称,否则不对称。

algotirhm.c

#include "algorithm.h"


//判断字符串是否是对称串
bool symmetry(ElemeType_SStk str[])
{
	SqStack s;//创建一个栈
	int i;
	ElemeType_SStk e;
	InitStack(s);//初始化一个栈
	for (i = 0; str[i]!='\0'; i++)
	{
		Push(s, str[i]);//入栈
	}
	for (i = 0; str[i] != '\0'; i++)
	{
		Pop(s, e);
		if (str[i] != e)
		{
			DestroyStack(s);//栈用完了得销毁
			return false;
		}
	}
	DestroyStack(s);//栈用完了得销毁   无论是true还是false,使用完的栈都要销毁
	return true;
}

algotirhm.h

#ifndef _INC_ALGORITHM
#define _INC_ALGORITHM
/*
用于验证底层
用于设计算法
*/
#include "stack.h"

bool symmetry(ElemeType_SStk str[]);//判断字符串是否是对称串

#endif

main.c

#include "algorithm.h"

ElemeType_SStk str[10] = { 1,2,3,4,4,3,2,1 };

int main()
{
	if (symmetry(str))printf("true\n");
	else printf("false\n");
	return 0;
}

入栈和出栈的顺序规律Python 入栈和出栈的代码_算法_02

入栈和出栈的顺序规律Python 入栈和出栈的代码_出栈_03