作者: star_night | 来源:发表于2017-09-22 17:24 被阅读0次

顺序存储结构栈


#include<stdio.h>
//栈的顺序结构
#define MAXSIZE 100
#define SIZE sizeof(stack)
typedef struct {
  int data[MAXSIZE];
  int top;
}stack;

stack *initStack();
int Empty(stack *s);
int pushStack(stack *s, int d);
int popStack(stack *s, int *d);
int topStack(stack *s, int *d);

int main(){
  stack *s = initStack();
  pushStack(s,1);
  pushStack(s,2);
  pushStack(s,3);
  while (!Empty(s)) {
    int data;
    topStack(s,&data);
    printf("top=%d,", data);
    popStack(s,&data);
    printf("pop=%d\n", data);
  }
  return 0;
}

//栈初始化
stack *initStack(){
  stack *p;
  p = (stack*)malloc(SIZE);
  p->top = -1;
  return p;
}
//判空
int Empty(stack *s){
  if(s->top == -1)
    return 1;
  return 0;
}
//入栈
int pushStack(stack *s, int d){
  if (s->top == MAXSIZE-1)
    return 0;
  s->top++;
  s->data[s->top] = d;
  return 1;
}
//出栈
int popStack(stack *s, int *d){
  if(Empty(s))
    return 0;
  *d = s->data[s->top];
  s->top--;
  return 1;
}
//读取栈顶元素
int topStack(stack *s, int *d){
  if(Empty(s))
    return 0;
  *d = s->data[s->top];
  return 1;
}

共享栈


#include<stdio.h>

#define MAXSIZE 100
#define SIZE sizeof(dupsqstack)

typedef struct {
  int data[MAXSIZE];
  int lefttop;
  int righttop;
}dupsqstack;

dupsqstack *initDupsqstack();
int Empty(dupsqstack *s, char status);
int pushDupStack(dupsqstack *s, char status, int d);
int popDupStack(dupsqstack *s, char status, int *d);
int topDupStack(dupsqstack *s, char status, int *d);

int main(){
  dupsqstack *s = initDupsqstack();
  printf("emptyL-%d,emptyR-%d\n", Empty(s,'L'), Empty(s,'R'));

  pushDupStack(s,'L',1);
  pushDupStack(s,'L',2);
  pushDupStack(s,'L',3);

  pushDupStack(s,'R',1);
  pushDupStack(s,'R',2);
  pushDupStack(s,'R',3);

  while (!Empty(s,'L') && !Empty(s,'R')) {
    int l,r;
    topDupStack(s,'L', &l);
    topDupStack(s,'R', &r);
    printf("topL=%d,topR=%d\n", l, r);

    popDupStack(s,'L', &l);
    popDupStack(s,'R', &r);
    printf("popL=%d,popR=%d\n", l, r);
  }
  return 0;
}

//栈初始化
dupsqstack *initDupsqstack(){
  dupsqstack *s = (dupsqstack*)malloc(SIZE);
  s->lefttop = -1;
  s->righttop = MAXSIZE;
  return s;
}

//栈判空
int Empty(dupsqstack *s, char status){
  switch (status) {
    case 'L':
      if (s->lefttop == -1)
        return 1;
      break;
    case 'R':
      if (s->righttop == MAXSIZE)
        return 1;
      break;
    default:
      printf("输入错误\n");
      break;
  }
  return 0;
}

//入栈
int pushDupStack(dupsqstack *s, char status, int d){
  if (s->lefttop + 1 == s->righttop)
    return 0;
  switch (status) {
    case 'L':
      s->data[++s->lefttop] = d;
      break;
    case 'R':
      s->data[--s->righttop] = d;
      break;
    default:
      printf("输入错误\n");
      return 0;
      break;
  }
  return 1;
}
//出栈
int popDupStack(dupsqstack *s, char status, int *d){
  if (Empty(s,status))
    return 0;
  switch (status) {
    case 'L':
      *d = s->data[s->lefttop--];
      break;
    case 'R':
      *d = s->data[s->righttop++];
      break;
    default:
      printf("输入错误\n");
      return 0;
      break;
  }
  return 1;
}

//栈顶元素
int topDupStack(dupsqstack *s, char status, int *d){
  if (Empty(s,status))
    return 0;
  switch (status) {
    case 'L':
      *d = s->data[s->lefttop];
      break;
    case 'R':
      *d = s->data[s->righttop];
      break;
    default:
      printf("输入错误\n");
      return 0;
      break;
  }
  return 1;
}

链式存储结构栈


#include<stdio.h>

#define SIZE sizeof(stackNode)

typedef struct stackNode{
  int data;
  struct stackNode *next;
}stackNode;

stackNode *initStackList();
int stackEmpty(stackNode *head);
int pushStack(stackNode *head, int d);
int popStack(stackNode *head, int *d);
int topStack(stackNode *head, int *d);

int main(){
    stackNode *head = initStackList();
    printf("isEmpty = %d\n", stackEmpty(head));
    pushStack(head,1);
    pushStack(head,2);
    pushStack(head,3);

    while (!stackEmpty(head)) {
      int d;
      topStack(head,&d);
      printf("top=%d,", d);
      popStack(head,&d);
      printf("pop=%d\n", d);
    }
    return 0;
}


//栈链表初始化
stackNode *initStackList(){
  stackNode *p = (stackNode*)malloc(SIZE);
  p->next = NULL;
  return p;
}

//栈链表判空
int stackEmpty(stackNode *head){
  if(head->next == NULL)
    return 1;
  return 0;
}

//栈链表入栈
int pushStack(stackNode *head, int d){
  stackNode *new;
  if ((new = (stackNode*)malloc(SIZE)) == NULL) {
    return 0;
  }
  new->data = d;
  new->next = head->next;
  head->next = new;
  return 1;
}

//栈链表出栈
int popStack(stackNode *head, int *d){
  if (stackEmpty(head)) {
    return 0;
  }
  stackNode *p = head->next;
  *d = p->data;
  head->next = p->next;
  // free(p);
  return 1;
}

//栈链表栈顶元素
int topStack(stackNode *head, int *d){
  if (stackEmpty(head)) {
    return 0;
  }
  stackNode *p = head->next;
  *d = p->data;
  return 1;
}

相关文章

  • Java实现栈

    数组栈:压栈、出栈、返回栈顶元素 链式栈:压栈、出栈、返回栈顶元素

  • 数据结构之 栈

    栈结构 链式栈 一.栈结构体 1构建空栈 2栈置空 3判断栈空 4获取栈顶 5入栈 6出栈 7便利栈 二.链式栈 ...

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • 递归累加数组

    入栈 5入栈 4入栈 3入栈 2入栈 1出栈 [1 0]出栈 [2 1 0]出栈 [3 2 1 0]出栈 [4 3...

  • 栈的逻辑结构和存储结构

    main()进栈s(1)进栈s(0)进栈 s(0)出栈s(1)出栈main()出栈 顺序栈 一个数组 + 指向栈顶...

  • 单调栈 2020-06-12(未经允许,禁止转载)

    1.单调栈 指栈内元素保持单调性的栈结构,分为单调增栈(栈底到栈顶元素递增)和单调减栈(栈底到栈顶元素递减) 2....

  • 链栈的操作

    链栈的定义 链栈的操作 初始化 判断栈空 入栈 出栈

  • 函数调用栈平衡

    栈平衡 栈平衡:函数调用前后的栈顶指针指向的位置不变 内平栈 外平栈 内平栈: 指的是在函数调用返回之前使栈保持...

  • 栈的简单Java实现

    栈栈的特点是先进后出,出栈、入栈都是在栈顶操作。

  • 汇编学习-入栈和出栈

    栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/mobfextx.html