栈的建立及相关算法


# include
# include
typedef struct node{
  int data;/*数据域*/
  struct node * next; /*指针域*/
}node,*pnode;/*栈节点*/

typedef struct Stack{
  pnode top;
  pnode bottom;
} stack,*pstack;/*栈本身*/

void stack_push(pstack s,int val);//入栈
void stack_pop(pstack s);/*出栈*/
bool stack_isempty(pstack s);/*栈是否为空*/
void showstack(pstack s);/*遍历栈*/
int main(){
  /*初始化创建栈*/
  stack s;
  pstack p = &s;
  pnode pnew = (pnode)malloc(sizeof(node));
  p->bottom = p->top = pnew;/*最初栈顶和栈底都指向空*/
  /*测试stack_push()*/
  stack_push(p,5);
  stack_push(p,7);
  stack_push(p,19);
  showstack(p);
  /*测试stack_pop()*/
  stack_pop(p);
  showstack(p);
  stack_pop(p);
  showstack(p);
  /*测试stack_isempty()*/
  if(stack_isempty(p)) printf("栈空\n");
  else printf("栈非空\n");
  stack_pop(p);
  if(stack_isempty(p)) printf("栈空\n");
  else printf("栈非空\n");
  return 0;
}
void stack_push(pstack s,int val){
  pnode pnew = (pnode)malloc(sizeof(node));/*创建新节点*/
  pnew->data = val;
  pnew->next = s->top;
  s->top = pnew;
  /*尾插法插入,栈顶上移*/
}

void showstack(pstack s){
  /*自上而下遍历整个栈*/
  for(pnode p = s->top;p != s->bottom;p = p->next)

  {
  printf("%d ",p->data);
  }
  printf("\n");
}

void stack_pop(pstack s){
  pnode p = s->top;/*用于删除的指针p*/
  s->top = p->next;/*栈顶下移*/
  free(p);
  p = NULL;/*删除栈顶元素*/
}
bool stack_isempty(pstack s){
  if(s->bottom == s->top) return true;/*当栈顶和栈底指向相同说明整个栈没有元素了*/
  else return false;
}