棧結構
棧的ADT
棧是有限制的線性結構,即元素要遵照後進先出(LIFO)的原則進出棧。
棧的主要操作有進棧(Push),出棧(Pop),判空(IsEmpty)等。
棧可由順序結構或者鏈式結構實現。
棧的鏈式結構實現
// stack.h宣告棧的結構和部分操作
#ifndef DS_LINK_STACK_H
#define DS_LINK_STACK_H
// a link stack
typedef char DataType;
struct StackNode;
typedef struct StackNode StackNode;
typedef struct StackNode *Stack;
// return an empty stack
Stack CreateStack(void);
// return 1 if the stack is empty, otherwise return 0
int IsEmptyStack(const Stack stack);
// push the data on the top
void Push(Stack stack, DataType data);
// return the top data
DataType Pop(Stack stack);
// make an empty stack
void MakeEmptyStack(Stack stack);
// destory the stack
void DestoryStack(Stack stack);
#endif
// 棧的一些操作的實現
#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
struct StackNode{
DataType data;
StackNode *next;
};
int IsEmptyStack(const Stack stack) {
return stack->next == NULL;
}
Stack CreateStack(void) {
Stack S = (Stack) malloc (sizeof(StackNode));
if(!S) {
printf("memory is full, create stack failed!\n");
return NULL;
}
S->next = NULL;
return S;
}
void Push(Stack stack, DataType data) {
if(stack == NULL) {
printf("must create a stack first!\n");
return ;
}
StackNode* node = (StackNode*) malloc (sizeof(StackNode));
node->data = data;
node->next = stack->next;
stack->next = node;
}
DataType Pop(Stack stack) {
if(stack == NULL) {
printf("must create stack first!\n");
exit(1);
}
if(IsEmptyStack(stack)) {
printf("stack is empty! no data to pop!\n");
exit(1);
}
StackNode *tmp = stack->next;
DataType data = tmp->data;
stack->next = tmp->next;
free(tmp);
return data;
}
void MakeEmptyStack(Stack stack) {
if(stack == NULL) {
printf("the stack doesn't exist! create one first!\n");
return ;
}
if(IsEmptyStack(stack)) {
printf("stack is already empty!\n");
return ;
}
while(!IsEmptyStack(stack)) {
Pop(stack);
}
}
void DestoryStack(Stack stack) {
if(stack == NULL) {
printf("the stack doesn't exist!\n");
return ;
}
free(stack);
}
相關文章
- 資料結構-棧資料結構
- 資料結構 - 棧資料結構
- 棧結構-物件形式物件
- 資料結構(筆試題-棧(入棧出棧)資料結構筆試
- 資料結構之「棧」資料結構
- 資料結構之——棧資料結構
- javascript資料結構 -- 棧JavaScript資料結構
- 資料結構之棧資料結構
- 資料結構(1):棧資料結構
- javascript中的棧結構JavaScript
- Java版-資料結構-棧Java資料結構
- js資料結構之棧JS資料結構
- JavaScript資料結構之-棧JavaScript資料結構
- 資料結構03-棧資料結構
- 資料結構:棧詳解資料結構
- JavaScript資料結構之棧JavaScript資料結構
- js資料結構--棧(stack)JS資料結構
- JavaScript資料結構02 - 棧JavaScript資料結構
- 波波的資料結構-棧資料結構
- 資料結構筆記——棧資料結構筆記
- 資料結構—棧/佇列資料結構佇列
- Python資料結構——棧Python資料結構
- 資料結構-佇列、棧資料結構佇列
- 資料結構:棧的基本概念、順序棧、共享棧以及鏈棧資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 結構與演算法(02):佇列和棧結構演算法佇列
- 特殊資料結構:單調棧資料結構
- 重學資料結構(二、棧)資料結構
- 重學資料結構之棧資料結構
- JS 裡的資料結構 - 棧JS資料結構
- JS資料結構-棧-練習JS資料結構
- 線性結構 佇列與棧佇列
- python資料結構之棧Python資料結構
- js實現資料結構--棧JS資料結構
- 資料結構-棧與佇列資料結構佇列
- 資料結構—棧和佇列資料結構佇列
- 資料結構(棧和佇列)資料結構佇列
- 【資料結構】--棧和佇列資料結構佇列