1. 程式人生 > >棧實現(順序結構)

棧實現(順序結構)

順序結構

#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");
  }
}