数据结构day6(栈)

  •  栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
  • 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

 head.h

#ifndef __EE_H__
#define __EE_H__

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

typedef int datadef;
#define MAX 10

typedef struct
{

  datadef data[MAX]; // 数据域

  int top; // 指针域
} *stack, Stack;

stack creat(); // 创建新栈

int push(stack S, datadef s); // 压栈
int pop(stack S);             // 出栈

int output(stack S);   // 正向遍历
int T_output(stack S); // 反向遍历

void S_free(stack L); // 释放                  //链表释放

#eneif

fun.c

#include "head.h"

stack creat() // 创建新栈
{
  stack S = (stack)malloc(sizeof(Stack));
  if (S == NULL)
  {
    return NULL;
  }
  S->top = -1;
  return S;
}

/*
int insert(linklist L,linklist p,datedef e)  //p后插入 (中插)
{
linklist s=creat(0);
s->date=e;
s->next=p->next;
p->next=s;
L->len++;
return 0;
}


int indel(linklist L,linklist p)            //p后删除 (中删)
{
  linklist q=p->next;
    p->next=q->next;
  L->len--;
  free(q);
  q=NULL;
return 0;
}
*/

int push(stack S, datadef s) // 压栈
{
  if (S == NULL || S->top == MAX)
  {
    printf("入栈失败\n");
    return -1;
  }
  S->top++;
  S->data[S->top] = s;

  return 0;
}

int pop(stack S) // 出栈
{
  if (S->top == -1 || S == NULL)
  {
    printf("出栈失败\n");
  }
  printf("出栈的元素是: %d\n", S->data[S->top]);
  S->top--;
}

int output(stack S) // 正向遍历
{

  if (S->top == -1 || S == NULL)
  {
    printf("遍历失败\n");
    return -1;
  }
  printf("正向遍历:");
  for (int i = 0; i <= S->top; i++)
  {
    printf("%d\t", S->data[i]);
  }
  puts("");
  return 0;
}

int T_output(stack S) // 反向遍历
{

  if (S->top == -1 || S == NULL)
  {
    printf("遍历失败\n");
    return -1;
  }
  printf("反向遍历:");
  for (int i = S->top; i >= 0; i--)
  {
    printf("%d\t", S->data[i]);
  }
  puts("");
  return 0;
}

void S_free(stack L) // 释放
{

  if (L == NULL)
  {
    return;
  }

  int n = L->top;
  for (int i = 0; i < n; i++)
  {
    pop(L);
  }
  free(L);
  L = NULL;
}

main.c

#include "head.h"

int main(int argc, const char *argv)
{

  stack S = creat();

  int n;
  datadef s, e;

  while (1)
  {
    printf("你要入栈的元素:");
    scanf("%d", &s);
    push(S, s);

    printf("你要继续入栈吗?N/n\n");
    char c;
    scanf(" %c", &c);
    if (c == 'n' || c == 'N')
    {
      break;
    }
  }
  output(S);
  T_output(S);

  pop(S);

  output(S);
  T_output(S);

  S_free(S);

#if 0
printf("你要尾插的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("你要尾插的元素是:");
scanf("%d",&s);
r_insert(L,s);       //尾插
}
output(L);


bubble(L);       //排序
output(L);

L_free(L);        //链表释放

#endif
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值