栈实现(顺序结构)

顺序结构

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>


#define STACK_SIZE 100

typedef int ElemType;

typedef enum { overflow, underflow, success, fatal}Status;

typedef struct stack{
  ElemType *ele;
  int stackSize;
  int top;
}Stack, *StackPtr;

栈操作

  1. 初始化 :

时间复杂度: O(1)

Status initStack(StackPtr *stack_ptr){
  Status s = success;
  (*stack_ptr) = (StackPtr) malloc(sizeof(Stack));

  if(!stack_ptr) {
    s = fatal;
    return s;
  }

  ElemType *tmp = (ElemType*)malloc(sizeof(ElemType)*STACK_SIZE);
  if(tmp) {
    (*stack_ptr)->ele = tmp;
    (*stack_ptr)-> top = -1;
    (*stack_ptr)-> stackSize = STACK_SIZE;
  } else {
    s = fatal;
  }

  return s;
}
  1. 清空 :

时间复杂度: O(1)

void clearStack(StackPtr stack_ptr) {
  if(!isEmpty(stack_ptr)){
    stack_ptr->top = -1;
  }
}
  1. 销毁 :

时间复杂度: O(1)

void destroyStack(StackPtr *stack_ptr) {
  if(stack_ptr) {
    free((*stack_ptr)->ele);
    (*stack_ptr) -> ele = NULL;
    free((*stack_ptr));
    *stack_ptr = NULL;
  }
}
  1. 入栈 :

时间复杂度: O(1)

Status stack_push(StackPtr stack_ptr, ElemType ele){
  Status s = success;
  if(stack_ptr -> top == STACK_SIZE - 1) {
    s = overflow;
  } else {
    (stack_ptr -> top) ++;
    (stack_ptr -> ele)[stack_ptr->top ] = ele;
  }
  return s;
}
  1. 出栈 :

时间复杂度: O(1)

Status stack_pop(StackPtr stack_ptr,ElemType *ele){
  Status s = success;
  if(isEmpty(stack_ptr)){
    s = underflow;
  }else{
    *ele = stack_ptr->ele[stack_ptr -> top];
    stack_ptr -> top --;
  }
  return s;
}
  1. 取栈顶元素 :

时间复杂度: O(1)

Status stack_top(StackPtr stack_ptr,ElemType *ele){
  Status s = success;
  if(isEmpty(stack_ptr)){
    s = underflow;
  }else{
    *ele = stack_ptr->ele[stack_ptr -> top];
  }
  return s;
}
  1. 判断栈空 :

时间复杂度: O(1)

bool isEmpty(StackPtr stack_ptr){
  if(stack_ptr -> top == -1) {
    return true;
  }
  return false;
}
  1. 获取栈大小 :

时间复杂度: O(1)

int getlength(StackPtr stack_ptr){
  if(stack_ptr && stack_ptr -> top != -1) {
    return (stack_ptr -> top) + 1;
  }
  return 0;
}
  1. 打印栈 :

时间复杂度: O(n)

void printStack(StackPtr stack_ptr){
  if(!isEmpty(stack_ptr)) {
    printf("+++++++++++++++\n");
    for(int i = 0; i <= stack_ptr->top; i++){
      printf("stack[%d]:%d\n", i, stack_ptr->ele[i]);
    }
    printf("+++++++++++++++\n");
  }
}

猜你喜欢

转载自blog.csdn.net/kelly_fumiao/article/details/85260117