创建动态栈

来源:互联网 发布:淘宝耐克旗舰店双十一 编辑:程序博客网 时间:2024/05/21 11:36
/*
 2017年6月16日 15:33:30
 数据结构(c)
 创建动态栈
 初始化栈 压栈 出栈 遍历
*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct node
{
 int data;
 struct node* pNext ;
}NODE, *PNODE;
typedef struct Stack
{
 PNODE pTop, pBottom;
}STACK, * PSTACK;
void init (PSTACK);//初始化栈
bool push (PSTACK pS, int t);//压栈
int pop (PSTACK pS);//出栈
void traverse(PSTACK pS);//遍历
void clear(PSTACK pS);//清空
bool is_empty(PSTACK pS);//是否为空

int main (void)
{
 STACK s;
 init (&s);//初始化栈
 printf("\n初始化栈成功\n");
 push (&s, 4);//压栈
 push (&s, 7);//压栈
 push (&s, 2);//压栈
 push (&s, 0);//压栈
 push (&s, 6);//压栈
 push (&s, 7);//压栈
 printf("\n压栈成功\n");
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 clear(&s);//清空
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 push (&s, 8);//压栈
 push (&s, 7);//压栈
 push (&s, 5);//压栈
 push (&s, 4);//压栈
 push (&s, 0);//压栈
 push (&s, -1);//压栈
 printf("\n压栈成功\n");
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 pop (&s);//出栈
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 pop (&s);//出栈
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 pop (&s);//出栈
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 pop (&s);//出栈
 traverse(&s);//遍历
 printf("\n遍历成功\n");
 pop (&s);//出栈
 traverse(&s);//遍历
 printf("\n遍历成功\n");

 return 0;
}
void init (PSTACK pS)//初始化栈
{
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if (NULL == pNew)
 {
  printf("内存分配失败,程序崩溃\n");
  exit (-1);
 }
 pNew->pNext = NULL;
 pS->pBottom = pNew;
 pS->pTop = pNew;
 return; 
}
bool push (PSTACK pS, int t)//压栈
{
 PNODE q;
 PNODE pNew = (PNODE)malloc(sizeof(NODE));
 if (NULL == pNew)
 {
  printf("内存分配失败,程序崩溃\n");
  return false;
  exit (-1);
 }
 pNew->data = t;
 
 q = pS->pTop;
 pS->pTop = pNew;
 pNew->pNext = q;
 return true;
}
bool is_empty(PSTACK pS)//是否为空
{
 if (pS->pBottom == pS->pTop )
  return true;
 else
  return false;
 
 
}

void traverse(PSTACK pS)//遍历
{
 PNODE t = pS->pTop;
 while (pS->pBottom  != t)
 {
  printf("%d ",t->data);
  t = t ->pNext ;
 }
 printf("\n");
}
int pop (PSTACK pS)//出栈
{
 int m = pS->pTop->data;
 PNODE t = pS->pTop ;
 pS->pTop = pS->pTop->pNext ;
 free(t);
 t = NULL;
 return m;
}
void clear(PSTACK pS)//清空
{
 if (is_empty(pS))
  return;
 else
 {
  PNODE p, q;
  p = pS->pTop ;
  q = NULL ;
  while (p != pS->pBottom )//释放内存
  {
   q = p->pNext ;
   free(p);
   p = q;
  }
  pS->pTop = pS->pBottom ;
  return;
 }
}