数据结构:3.1 栈及C/C++实现顺序栈的基本操作(源码)

153 阅读2分钟
  1. // 3.1.1 栈的基本概念
    //    1. 栈的定义:栈是只允许在一端进行插入或删除操作的线性表
    //       栈的操作特性:后进先出(Last In First Out, LIFO)
    //    2. 栈的基本操作
    //       InitStack(&S);
    //       StackEmpty(S);
    //       Push(&S, x);
    //       Pop(&S, &x);
    //       GetTop(S, &x);
    //       DestroyStack(&S)
    
    // 3.1.2 栈的顺序存储结构
    //    1. 顺序栈的实现
    //       栈的顺序存储类型
    //       #define MaxSize 50
    //       typedef struct {
    //          ElemType data[MaxSize];
    //          int top;
    //       }SqStack;
    //    2. 顺序栈的基本运算
    //    3. 共享栈:利用栈底位置相对不变的特性,让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
    
    // 3.1.3 栈的链式存储结构
    //       栈的链式存储类型:
    //       typedef struct Linknode {
    //          Elemtype data;
    //          struct Linknode *next;
    //       } *LiStack;
    
  2. C/C++实现顺序栈的基本操作(源码)

    #include<stdio.h>
    #include<stdlib.h>
    
    #define MaxSize 10
    
    typedef int ElemType;
    
    typedef struct{
      ElemType data[MaxSize];
      int top;
    }SqStack, *PSqStack;
    
    // 初始化
    void InitStack(PSqStack &S) {
      S = (PSqStack)malloc(sizeof(SqStack));
      S->top = -1;
    }
    
    // 判空
    bool StackEmpty(PSqStack S) {
      if (!S) {
        printf("栈不存在 \n");
        return false;
    }
    
      if(S->top == -1) {
        printf("栈空 \n");
        return true;
      } else {
        printf("栈非空  \n");
        return false;
      }
    }
    
    // 进栈
    void Push(PSqStack &S, ElemType x) {
      if (S->top == MaxSize - 1) {
        printf("栈满,无法进栈  \n");
        return;
      }
    
      S->data[++S->top] = x;
    }
    
    // 出栈
    ElemType Pop(PSqStack &S) {
      if (S->top == -1) {
        printf("栈空,无法出栈  \n");
        return false;
      }
    
      return S->data[S->top--];
    }
    
    // 读栈顶元素
    ElemType GetTop(PSqStack S) {
      if (S->top == -1) {
        printf("栈空,无栈顶元素  \n");
        return false;
      }
    
      return S->data[S->top];
    }
    
    // 销毁
    void DestroyStack(PSqStack &S) {
      free(S);
      S = NULL;
    }
    
    // 现有栈的出栈顺序
    void StackOrder(PSqStack S) {
      int len = S->top, i;
      for (i = len; i >= 0; i--) {
        printf("%d \n", S->data[i]);
      }
    }
    
    int main() {
      PSqStack S;
      ElemType x;
    
      printf("------------------初始化------------------ \n");
      InitStack(S);
      printf("------------------判空-------------------- \n");
      StackEmpty(S);
      printf("------------------进栈-------------------- \n");
      printf("请输入进栈元素: ");
      scanf("%d", &x);
      Push(S, x);
      printf("------------------判空-------------------- \n");
      StackEmpty(S);
      printf("------------------现有栈的出栈顺序---------- \n");
      StackOrder(S);
      printf("------------------进栈-------------------- \n");
      printf("请输入进栈元素: ");
      scanf("%d", &x);
      Push(S, x);
      printf("------------------现有栈的出栈顺序---------- \n");
      StackOrder(S);
      printf("------------------读栈顶元素---------------- \n");
      x = GetTop(S);
      printf("当前栈顶元素: %d  \n", x);
      printf("------------------出栈-------------------- \n");
      Pop(S);
      printf("------------------现有栈的出栈顺序----------- \n");
      StackOrder(S);
      printf("------------------销毁-------------------- \n");
      DestroyStack(S);
      printf("------------------判空-------------------- \n");
      StackEmpty(S);
      printf("------------------初始化------------------ \n");
      InitStack(S);
      printf("------------------判空-------------------- \n");
      StackEmpty(S);
    
      return 0;
    }