決定採用何種方式來儲存資料是非常重要的,這樣便於檢索資料時,資料會自動按照某種規定的順序給出。
棧是檢索資料的一種方式,它檢索元素的順序與儲存元素的順序相反。
棧:先進後出。
要把元素儲存到棧中,就「壓入」元素,要刪除棧中的元素,就「彈出」元素。
有時候,可以通過檢查棧頂的元素(而不是實際去刪除它)來獲取元素的某些資訊。
實現棧的方式有很多,這裡採用鍊錶來實現。因為棧本身就是個鍊錶,它與鍊錶有相同的特性。
1,這是單鏈表的介面定義:
#ifndef _dlist_h
#define _dlist_h
#include typedef struct dlistelmt_
dlistelmt;
typedef struct dlist_
dlist;
void dlist_init(dlist *list,void (*destroy)(void *data));
void dlist_destroy(dlist *list);
int dlist_ins_next(dlist *list,dlistelmt *element,const void *data); //成功返回1,失敗返回-1
int dlist_ins_prev(dlist *list,dlistelmt *element,const void *data); //成功返回0,失敗返回-1
int dlist_remove(dlist *list,dlistelmt *element,void **data);
#define dlist_size(list) ((list)->size)
#define dlist_head(list) ((list)->head)
#define dlist_tail(list) ((list)->tail)
#define dlist_is_head(element) ((element)->prev == null ? 1 : 0)
#define dlist_is_tail(element) ((element)->next == null ? 1 : 0)
#define dlist_data(element) ((element)->data)
#define dlist_next(element) ((element)->next)
#define dlist_prev(element) ((element)->prev)
#endif /* _list_h */
2,這是對單鏈表介面的實現細節:
#include "list.h"
#include #include #include void dlist_init(dlist *list,void (*destroy)(void *data))
void dlist_destroy(dlist *list)
memset(list,0,sizeof(dlist));
return;
}/* 插入成功返回1,否則返回 -1
* element == null ,鍊錶為空
*/int dlist_ins_next(dlist *list,dlistelmt *element,const void *data)
else
list->size++;
return 0;
}/* 插入成功返回0,否則返回-1
* 若element == null,鍊錶應該為空
*/int dlist_ins_prev(dlist *list,dlistelmt *element,const void *data) //成功返回0,失敗返回-1
else
else
element->prev = new_element;
} list->size++;
return 0;
}/* 刪除鍊錶中指定的元素
*/int dlist_remove(dlist *list,dlistelmt *element,void **data)
else
free(element);
list->size--;
return 0;
}
3,棧的介面定義:
#ifndef _stack_h
#define _stack_h
#include "list.h"
#include typedef list stack;
#define stack_init list_init
#define stack_destroy list_destroy
int stack_push(stack *stack,const void *data);
int stack_pop(stack *stack,void **data);
#define stack_size list_size
#define stack_peek ((stack)->head == null? null :(stack)->head = data)
#endif /* _stack_h */
4,棧的介面的實現:
#include "list.h"
#include "stack.h"
#include #include #include int stack_push(stack *stack,const void *data)
int stack_pop(stack *stack,void **data)
5,棧的簡單操作:
#include #include "list.h"
#include "stack.h"
#include #include stack stack;
void destroy(void *data)
typedef struct student_
student;
student *stu_init(char *nam,const unsigned char chinese,const unsigned char math)
student *dete(student *ptr,int n)
return ptr;
}void loop_print(void) }
int main(void)
下面是執行結果:
資料結構之棧結構
棧結構是一種filo first in last out 的批量資料儲存結構。其特點是先進後出,後來者居上 棧的基本屬性 棧記憶體 棧頂標記 棧的當前元素個數 萬金油屬性 size 棧的基本操作 萬金油的的操作 根據實現的不同將棧結構分為兩種 1.鏈式棧 2.陣列 利用有表頭鍊錶的頭插法來完成棧的功...
資料結構之棧
4.8.2 四則運算表示式求值 程式如下所示 include include include 定義結點型別 typedef struct node node,pnode 定義棧的抽象資料型別 typedef struct stack stack,pstack 函式宣告 對棧進行初始化的函式 void...
資料結構之棧
資料結構之棧 本文討論棧的陣列實現。棧需要有如下幾個屬性 棧的容量 capacity 棧頂指標 儲存棧元素的陣列 根據這幾個屬性可以定義乙個棧結構體 struct stackrecord 然後定義棧的操作,一般可以包含如下幾個 棧的建立 stack createstack int size 棧的銷毀...