基本概念
栈是一种只能在一端进行插入和删除操作的线性表
允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。当栈中没有元素时,称为空栈。栈的插入操作称为进栈或入栈;栈的删除操作称为退栈或出栈。
栈是先进后出的线性表,即先进展的元素先出栈,比如一个狭窄(只有一个人宽度)的死胡同就类似一个栈,先进去的人只能等最后才能出,这就是先进后出。
一个栈应该包括数据部分和栈顶指针,数据部分用来存放数据,栈顶指针用来始终指向栈顶。空栈时,栈顶指针指向-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;
}