棧實現(鏈式結構)
阿新 • • 發佈:2018-12-28
鏈式結構
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int ElemType;
typedef enum {overflow, underflow, success, fatal} Status;
typedef struct node{
ElemType ele;
struct node * next;
}Node,*NodePtr;
typedef struct stack{
NodePtr top;
}Stack,*StackPtr;
棧操作
- 初始化 :
時間複雜度: O(1)
Status initStack(StackPtr *stack_ptr){
Status s = success;
(*stack_ptr) = (StackPtr) malloc(sizeof(Stack));
if(!(*stack_ptr)) {
s = fatal;
return s;
} else{
(*stack_ptr)->top = NULL;
}
return s;
}
- 清空 :
時間複雜度: O(1)
void clearStack(StackPtr stack_ptr) {
stack_ptr->top = NULL;
}
- 銷燬 :
時間複雜度: O(1)
void destroyStack(StackPtr *stack_ptr) {
while(!isEmpty((*stack_ptr))){
NodePtr deleteNode = (*stack_ptr)->top;
(*stack_ptr)->top = deleteNode -> next;
free(deleteNode) ;
deleteNode = NULL;
}
free((*stack_ptr));
(*stack_ptr) = NULL;
}
- 入棧 :
時間複雜度: O(1)
Status stack_push(StackPtr stack_ptr, ElemType ele){
Status s = success;
NodePtr newNode = (NodePtr) malloc(sizeof(Node));
if(newNode) {
newNode -> ele = ele;
newNode -> next = stack_ptr->top;
stack_ptr -> top = newNode;
}else{
s = fatal;
}
return s;
}
- 出棧 :
時間複雜度: O(1)
Status stack_pop(StackPtr stack_ptr,ElemType *ele){
Status s = success;
if(isEmpty(stack_ptr)){
s = underflow;
}else{
(*ele) = stack_ptr->top->ele;
NodePtr deleteNode = stack_ptr -> top;
stack_ptr -> top = deleteNode -> next;
free(deleteNode);
deleteNode = NULL;
}
return s;
}
- 取棧頂元素 :
時間複雜度: O(1)
Status stack_top(StackPtr stack_ptr,ElemType *ele){
Status s = success;
if(isEmpty(stack_ptr)){
s = underflow;
}else{
(*ele) = stack_ptr->top->ele;
}
return s;
}
- 判斷棧空 :
時間複雜度: O(1)
bool isEmpty(StackPtr stack_ptr){
if(stack_ptr && stack_ptr->top != NULL) return false;
return true;
}
- 獲取棧大小 :
時間複雜度: O(1)
int getLength(StackPtr stack_ptr){
if(!isEmpty(stack_ptr)) {
NodePtr tmpPtr = stack_ptr->top;
int count = 0;
while(tmpPtr){
count ++;
tmpPtr = tmpPtr->next;
}
return count;
}
return 0;
}