一、栈
1、概念
1、尽在表尾进行插入或删除的线性表
2、后进先出,称为LIFO结构
3、表尾称为栈的栈顶(top)
4、表头称为栈顶(bottom)
非空栈的栈顶指针始终再栈顶元素的下一个位置
//栈的顺序存储表示
typedef struct
{
Elemtype *base;//指向栈底指针
Elemtype *top;//指向栈定指针
int stackSize;//栈当前可用最大容量
}sqStack;
或
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int top; // 用于标注栈顶的位置
int stackSize;
}
//创建一个空栈
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
//申请动态分配空间
if ( !s->base)//若s.base为0.则!s->base不为0,就退出
exit(0);
s->top = s->base;//空栈的标记
s->stackSize = STACK_INIT_SIZE;
}
2、插入(Push)与删除(Pop)
插入:进栈,压栈, 入栈。
删除:出栈,弹栈。
//进栈
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{
// 如果栈满,追加空间
if( s->top - s->base >= s->stackSize )//判断栈是否满
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base )//存储分配失败
exit(0);
s->top = s->base + s->stackSize; // 设置栈顶
s->stackSize = s->stackSize + STACKINCREMENT; // 设置栈的最大容量
}
*(s->top) = e;
s->top++;//先赋值给e,s.top再加1
}
//出栈
Pop(sqStack *s, ElemType *e)
{
if( s->top == s->base ) // 栈已空空是也
{
return ERROR;
}
*e = *--(s->top);//s.top先减1,再赋值给e
}
3、清空和销毁
//清空
ClearStack(sqStack *s){
s->top = s->base;
}
这个原理跟高级格式化只是但单纯地清空文件列表而没有覆盖硬盘的原理是一样的。
//销毁
DestroyStack(sqStack *s)
{
int i, len;
len = s->stackSize;
for( i=0; i < len; i++ )
{
free( s->base );
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}
Example
#include<stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //定义最大存储空间
#define STACKINCREMENT 10 //增加的存储空间,increment意为:加薪、增值
typedef struct {
int *base;
int *top;
int sum; //记录元素个数
int stacksize;
}Stack;
//初始化栈
void Init(Stack *s){
s->base=(int *)malloc(MAXSIZE*sizeof(Stack));
if(s->base==NULL){
printf("内存分配失败!");
}
s->top=s->base;
s->stacksize=MAXSIZE;
s->sum=0;
}
//在栈顶插入一个元素
void Push(Stack *s){
int e;
printf("请输入要插入的元素:");
scanf("%d",&e);
if(s->top-s->base>=s->stacksize){
s->base=(int *)realloc(s->base,s->stacksize+STACKINCREMENT*sizeof(Stack));
if(s->base==NULL)
{
printf("内存添加失败!");
}
s->stacksize=s->stacksize+STACKINCREMENT;
}
*(s->top++)=e;
s->sum++;
}
//向栈内输入元素
void Input(Stack *s){
int e;
printf("请依次输入数据\n");
while(s->top-s->base<s->stacksize){
//e=NULL;
scanf("%d",&e);
s->sum++;
*(s->top++)=e;
if(getchar()=='\n')
break;
}
}
//打印栈内元素
void PrintStack(Stack *s){
int e;
printf("栈内元素为:");
for(int i=1;i<=s->sum;i++)
{
e=*(s->top-i);
printf("%d ",e);
}
printf("\n");
}
//情况栈内元素
void ClearStack(Stack *s){
while(s->top!=s->base)
{
--s->top;
}
}
//删除栈顶元素
void Pop(Stack *s){
int e;
if(s->base==s->top){
printf("栈为空!");
exit(0);
}
else{
e=*(--s->top);
}
s->sum--;
}
//返回元素个数
int Stacklength(Stack *s){
return s->sum;
}
//返回栈顶元素
void GetTop(Stack *s)
{
int e;
if(s->base==s->top)
{
printf("栈为空!");
exit(0);
}
e=*(s->top-1);
printf("栈顶元素为:%d\n",e);
}
int main(){
Stack stack1,*p;
p=&stack1;
Init(p);
Input(p);
Push(p);
GetTop(p);
PrintStack(p);
Pop(p);
PrintStack(p);
ClearStack(p);
}