資料結構 棧和佇列OJ

2021-09-09 00:22:25 字數 3560 閱讀 8211

//c語言

這道題用棧來操作。復合先進後出。我們把左括號進行壓棧,右括號進行對比,匹配上就出棧。

一半布林值我都是用的 int ,0為假,非0為真。

int bracket(char* bra)

': case ']':

if (st_empt(&stack)) //如果棧是空的,說明沒有左括號,那肯定不匹配

char left = st_top(&stack);

if (!((left=='('&&*p == ')')||(left == '')||(left == '['&&*p == ']'))) //這裡有個!,是不滿足的括號匹配的,我們就返回 0;

st_del(&stack); //匹配了,刪除棧頂。

default:

break; //遍歷完後。退出迴圈

} ++p;

} return 1; //返回真

}

棧是先進後出,佇列是後進先出。所以實現需要一些手段。下面的圖是**裡比較難理解的地方

//c語言

typedef struct mystack

mystack; //這個結構體是佇列,雖然名字是棧

//初始化/建立

// mystack* stack = (mystack*)malloc(sizeof(mystack));//因為沒有給記憶體,則需要在堆上申請記憶體

mystack* myst_init(mystack* stack, int capacity)

//新增

//棧只能在棧頂進行操作。這兒隊尾當作棧頂

void myst_push(mystack* st, int data)

//刪除

//刪除也要在棧頂,但是佇列的刪除在隊尾。所以需要把隊首變成隊尾。

void myst_pop(mystack* st)

qu_pop(&(st->queue));//刪除

--st->queue.size;

} //取棧頂元素

void myst_top(mystack* st)

int temp2 = qu_head(&(st->queue));

qu_pop(&(st->queue));

qu_push(&(st->queue), temp2);

return temp2;

} //判斷為空

int myst_empt(mystack* st)

取棧頂元素和刪除一樣的,只是把刪除換成了取隊首元素的函式而已。  

有了上面的基礎,這個題也就有了一定的思想。中間的刪除就看這個圖。

//c語言

typedef struct myqueue

myqueue; //定義乙個佇列,內部是棧

//初始化

myqueue* mtqu_init(myqueue* queue)

//新增

void myqu_push(myqueue* qu, int data)

//刪除

void myqu_pop(myqueue* qu) //佇列需要先進先出

//我們把第乙個棧的元素取出壓到第二個棧裡面,那麼在第乙個棧的第乙個元素到第

//二個棧的棧頂了。我們就可以對棧頂進行刪除,這個時候實現對隊首的刪除。

} st_del(&(qu->stackb));

} //返回隊首

int myqu_front(myqueue* qu)

} return st_top(&(qu->stackb)); //和刪除一樣,把刪除操作換成第二個棧的棧頂元素

} //判斷為空

int myqu_empty(myqueue* qu)

最小棧也需要用兩個棧來實現。

//c語言

typedef struct minstack

minstack;

//初始化

minstack* mst_init()

//進棧

void mst_push(minstack* mst, int data)

else //不是的話就取出第二個棧的棧頂元素,比較兩個元素的值 }

} //出棧

void mst_pop(minstack* mst)

st_del(&(mst->stack1));

} //獲取最小

int mst_min(minstack* mst)

//棧頂

int mst_top(minstack* mst)

//判斷為空

int mst_empty(minstack* mst)

這道題的介面是真滴多。迴圈佇列就是乙個員=圓環,然後涉及乙個公式。公式解釋一下,**就好理解了,思路也有了。

//c語言

//迴圈佇列

//建立佇列

typedef int cqdata;

typedef struct circulatequeue

cq;cq* cq_init(int capacity)

int cq_push(cq* cq, int data)

cq->arr[cq->rear] = data;

cq->rear = (cq->rear + 1) % cq->capacity;

return data;

}int cq_pop(cq* cq)

--cq->size;

cq->front = (cq->front + 1) % cq->capacity;

return 1;

}cqdata cq_front(cq* cq)

return cq->arr[cq->front];

}cqdata cq_rear(cq* cq)

return cq->arr[(cq->rear + cq->capacity -1) % cq->capacity];

}int cq_empty(cq* cq)

int cq_full(cq* cq)

void cq_free(cq* cq)

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...

資料結構 棧和佇列

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。class solution int pop node stack2.top stack2.pop return node private stack stack1 stack stack2 大家都知道斐波那契數列,現...