栈(普通栈及链栈)

//palist->t来表示当前的数据下标,即可以模拟先进后出的特性

//栈数据结构体(最大值,指示当前栈中数的个数t,所存数据类型的指针s)

 

struct SeqStack{
  int MAXNUM;
  int t;
  DataType * s;
};

//基本操作压栈


void push_seq(PSeqList pastack, DataType x){
  /* code */
  if(pastack->t >= MAXNUM - 1 ) //提示是否上溢
    printf("overflow\n");
  else{
    pastack->t = pastack->t+1;  //栈中数量加一
    pastack->s[pastack->t] = x;//数据进栈
  }
}
void  pop_seq(PSeqList pastack/* arguments */) {
  /* code */
  if(pastack-> t== -1) //检查是否下溢
    printf("Underflow!\n");
  else

//出栈就是删除栈顶元素
    pastack->t = pastack->t-1;//
}

//取栈顶元素
DataType top_seq(PSeqList pastack)
{
  if( pastack->t == -1 )
      printf("It is empty!\n");//判断是否为空
  else
      return (pastack->s[pastack->t]);//返回当前栈顶元素
}

 

//____________以下为链栈实现算法___________________//

//链栈的数据结构体(info为栈中数据元素,Link统一指向下一个info)

struct Node;
typedef struct Node* PNode;
struct Node{
  DataType info;
  PNode Link;
}
struct LinkList{  //此结构体指针一律指向当前栈顶
  PNode top;
}
typedef struct LinkList *PLinkStack;
PLinkStack createEmptyStack_link(void) //创建空的链栈
{
  PLinkStack plstack; 
  plstack = (PLinkStack)malloc(sizeof(struct LinkList)); //申请空间
  if( plstack != NULL)  //判断是否申请成功
    plstack->top = NULL; //先指向空
  else
    printf("Out of space!\n");
    return plstack;
}
int isEmptyStack_link(PLinkStack plstack)    //判断链栈是否为空
{
  return (plstack->top == NULL);
}
void push_link(PLinkStack plstack,DataType x)  //压栈(与普通的略有不同)
{
  PNode p;
  p = (PNode)malloc(sizeof(struct Node));
  if(p == NULL)
  {
    printf("out of space!\n");
  }
  else
  {
    p->info = x;  //现存入参数
    p->link = pastack->top; //现在p的link指针指向栈顶,实际上就是把p->link指向原节点的数据域
    plstack->top = p;//栈顶指向新存入节点数据域
  }
}
void pop_link(PLinkStack plstack)//弹栈
{
  PNode p;
  if(isEmptyStack_link(plstack))
    printf("Empty stack pop.\n");
  else
  {
    p = plstack->top; // 为了把第一个节点释放,因此p在这里是标记
    plstack->top = plstack->top->link;//栈顶指向栈中第二个元素
    free(p);//释放原来的节点
  }
}
DataType top_link(PLinkStack plstack) // 返回栈顶元素
{
  if(pastack->top == NULL)
    printf("Stack is empty!\n");
  else
    return (plstack->top->info);//直接return栈顶的数据域元素
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值