- 棧(stack)
- 棧(stack)是限定僅在表尾進行插入或刪除操作的線性表。因此,對棧來說,表尾端有特殊含義,稱為棧頂(top),相應地,表頭端稱為棧底(bottom)。不含元素的空表稱為空棧。
- 棧的特點:棧的修改是按后進先出的原則進行的。因此,棧又稱為后進先出(last in first out)的線性表(LIFO)。
- 棧的基本操作:在棧頂進行插入或刪除,棧的初始化、判空及取棧頂元素等。
//棧的基本方法-構造一個存儲字符元素的棧 即stack.h頭文件 #include<stdio.h> #include<stdlib.h> #define INITSIZE 100 #define INCRSIZE 10 #define ERROR 0 #define OK 1 typedef int Status; typedef struct {//構造棧 char *base; char *top; int size; } SqStack; Status InitStack(SqStack *s) {//初始化棧 s->base = (char *)malloc(INITSIZE * sizeof(char)); if (!s->base) return ERROR; s->top = s->base; s->size = INITSIZE; return OK; } Status ClearStack(SqStack *s) {//清空棧 s->top = s->base; } Status StackEmpty(SqStack *s) {//判空 if (s->top == s->base) return 1; else return 0; } int StackLength(SqStack (*s) {//獲取棧的長度 return s->top - s->base ; } Status GetTop(SqStack s, char *e) {//獲取棧頂元素 if (s.top == s.base) return ERROR; *e = *(s.top - 1); return OK; } Stack Push(SqStack *s, char e) {//壓棧 if (s->top - s->base >= s->size) { s->base = (char *)realloc(s->base, (s->size + INCRSIZE)*sizeof(char)); if (!s->base) exit(1); s->top = s->base + s->size; s->size += INCRSIZE; } *(s->top) = e; s->top ++; return OK; } Status Pop(SqStack *s, char *e) {//彈出元素 if (s->top == s->base) return ERROR; *e = *(--s->top); return OK; } void StackTraverse(SqStack *s) {//打印棧中元素,棧頂->棧底 if (!s->base) exit(1); char *t = s->top - 1; while(t >= s->base) { printf("%c", *t); t--; } }
//c++棧的基本方法 #include<iostream> using namespace std; #define starksize 100 typedef struct{ char *base; char *top; int length ; }StarkTR typedef struct{ int *base; int *top; int length ; }StarkND; //寄存操作數 int InitTR(StarkTR &L){ //初始化寄存operater棧 L.base = new char[starksize]; L.top = L.base; L.length = starksize; return 1; } int PushTR(StarkTR &L,char e){ //入棧 if(L.top - L.base == L.length){ cout<<"棧滿!"; return 0; } *L.top++ = e; return 1; } char PopTR(StarkTR &L,char &e){ //出棧 if(L.top - L.base == 0){ cout<<"棧空!"; return 0; } e = *--L.top; return 1; } char GetTopTR(StarkTR L){ //取棧頂元素 字符 if(L.top != L.base) return *(L.top -1); } int GetTopND(StarkND L){ //取棧頂元素 數值 if(L.top != L.base) return *(L.top -1); }
- 隊列(queue)
- 隊列(queue)和棧相反,是一種先進先出(first in first out,FIFO)的線性表。它允許在表的一端進行插入,而在另一端刪除元素。這和我們生活中的排隊是一致的,最早進入隊列的元素最早離開。在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱為隊頭(front)。
- 隊列的基本操作:初始化空隊列、清空隊列、判空、獲取隊列的長度、獲取隊頭元素、插入隊尾元素、刪除隊頭元素、visit()從隊頭到隊尾遍歷等。