数据结构--栈和队列

一、栈

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值