棧實現(順序結構)
阿新 • • 發佈:2018-12-28
順序結構
#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;
棧操作
- 初始化 :
時間複雜度: 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;
}
- 清空 :
時間複雜度: O(1)
void clearStack(StackPtr stack_ptr) {
if(!isEmpty(stack_ptr)){
stack_ptr->top = -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;
}
}
- 入棧 :
時間複雜度: 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;
}
- 出棧 :
時間複雜度: 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;
}
- 取棧頂元素 :
時間複雜度: 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;
}
- 判斷棧空 :
時間複雜度: O(1)
bool isEmpty(StackPtr stack_ptr){
if(stack_ptr -> top == -1) {
return true;
}
return false;
}
- 獲取棧大小 :
時間複雜度: O(1)
int getlength(StackPtr stack_ptr){
if(stack_ptr && stack_ptr -> top != -1) {
return (stack_ptr -> top) + 1;
}
return 0;
}
- 列印棧 :
時間複雜度: 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");
}
}