資料結構演算法程式碼實現——棧和佇列(一)
棧和佇列
棧和佇列是一種特殊的線性表。
從資料結構角度看:棧和佇列也是線性表,其特點性在於棧和佇列的基本操作是線性表操作的子集。它們是操作受限的線性表。
從資料型別角度看:它們是和線性表不相同的兩類重要的抽象資料型別。
棧的定義
棧(Stack)是限定僅在表尾進行插入或刪除操作的線性表。允許經行插入刪除操作的表尾被稱為棧頂,相應的表頭被稱為棧底。
向棧中插入一個元素稱為入棧(壓棧),從棧中刪除一個元素稱為出棧(退棧)。棧中無資料元素時稱為空棧。
棧的特點:先進後出,後進先出(LIFO)。
棧的表示與實現
和線性表類似,棧也有兩種儲存表示方法即:順序和鏈式。
1,棧的鏈式儲存:因為棧也是線性表,所以線性表的不帶頭結點單鏈表結構可以作為棧的鏈式結構。這樣,就可以利用單鏈表的操作了。
如:
單鏈表初始化的表頭可以作為棧的表頭;
單鏈表 ListInsert(S, 1, e)可以作為棧的入棧操作Push;
單鏈表ListDeleteS,1, *e)可以作為棧的出棧操作Pop;
單鏈表的頭插法,可以建立一個棧。
2,棧的順序儲存:有關詳細資訊請看教材46頁
//-----棧的順序儲存表示------
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
棧的基本操作
//------基本操作----------- Status InitStack(SqStack *S){ //構造一個空棧 (*S).base =(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top =(*S).base; (*S).stacksize =STACK_INIT_SIZE; return OK; } //2 Status DestroyStack(SqStack *S){ //銷燬一個棧 free( (*S).base);//釋放表 (*S).top =NULL; (*S).base =NULL; (*S).stacksize =0; return OK; } //3, Status ClearStack(SqStack *S){ //設定表為空 (*S).top =(*S).base;//指向棧底 return OK; } //4 Status StackEmpty(SqStack S){ //是否為空 if(S.top == S.base) return TRUE; else return FALSE; } //5 int StackLength(SqStack S){ //返回棧的長度 return S.top-S.base; } //6 Status GetTop(SqStack S,SElemType *e){ //如棧不空,返回棧頂元素 if(S.top == S.base) return ERROR; *e =*(S.top-1); //返回棧頂元素 return OK; } //7 Status Push(SqStack *S,SElemType e){ //入棧操作 //判斷棧滿 if( (*S).top-(*S).base >(*S).stacksize){ (*S).base =(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); (*S).top =(*S).base+(*S).stacksize;//重新定位棧頂指標 (*S).stacksize+=STACKINCREMENT; } *( (*S).top )++ =e; //先插入,棧頂指標在+1 return OK; } //8 Status Pop(SqStack *S,SElemType *e){ //出棧操作 //判斷是否為空 if((*S).top ==(*S).base) return ERROR; *e= *--(*S).top;//先棧頂指標-1,在取元素 return OK; } //9 Status StackTraverse(SqStack S,Status(*visit)(SElemType)) { // 從棧底到棧頂依次對棧中每個元素呼叫函式visit() while(S.top>S.base) visit(*S.base++); printf("\n"); return OK; }
測試程式碼:
#include"ch2.h" typedef int SElemType; #include"Stack.c" Status visit(SElemType c) { printf("%d ",c); return OK; } //-----測試---- main(){ int j; SqStack s; SElemType e; // printf("--------測試------------\n"); printf("---初始化棧,並把1-6入棧---\n"); if(InitStack(&s)==OK) for(j=1;j<=6;j++) Push(&s,j); printf("棧中元素依次為:"); StackTraverse(s,visit); printf("---出棧操作---\n"); Pop(&s,&e); printf("彈出的棧頂元素 e=%d\n",e); printf("棧是否空:%d(1:空 0:否)\n",StackEmpty(s)); printf("---獲取棧頂元素及棧的長度---\n"); GetTop(s,&e); printf("棧頂元素 e=%d 棧的長度為%d\n",e,StackLength(s)); printf("---清空棧---\n"); ClearStack(&s); printf("清空棧後,棧是否空:%d(1:空 0:否)\n",StackEmpty(s)); printf("---銷燬棧---\n"); DestroyStack(&s); printf("銷燬棧後,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize); }
測試結果圖:
相關推薦
資料結構演算法程式碼實現——棧和佇列(一)
棧和佇列 棧和佇列是一種特殊的線性表。 從資料結構角度看:棧和佇列也是線性表,其特點性在於棧和佇列的基本操作是線性表操作的子集。它們是操作受限的線性表。 從資料型別角度看:它們是和線性表不相同的兩類重要的抽象資料型別。 棧的定義 棧(Stack)是限
資料結構:實驗四棧和佇列的基本操作實現及其應用
一、實驗目的 1,熟練掌棧和佇列的結構特點,掌握棧和佇列的順序儲存和鏈式儲存結構和實現。 2,學會使用棧和佇列解決實際問題。 二、實驗內容 1,自己確定結點的具體資料型別和問題規模: 分別建立一個順序棧和鏈棧,實現棧的壓棧和出棧操作。 分別建立一個順
資料結構JAVA版之棧和佇列
一、涉及的內容大綱 二、簡單介紹棧、佇列和其他資料結構的不同 1 對於其他的資料結構而言,都適用與資料庫應用中作資料記錄。但是因為棧和佇列的生命週期比那些資料庫型別的資料結構要短,所以他們只是在程式的操作期間才會建立和執行,在完成任務之後就會被銷燬。所以棧和佇列更多的是用於構思演算法的
玩轉資料結構——第二章:棧和佇列
內容概覽: 棧和棧的應用:撤銷操作和系統棧 棧的基本實現 棧的另外一個應用:括號匹配 關於Leetcode的更多說明 陣列佇列 迴圈佇列 迴圈佇列的實現 陣列佇列和迴圈佇列的比較 2-1.棧(Stack) 棧也是一種線性結構
資料結構實踐 停車場模擬 棧和佇列綜合
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
資料結構學習篇之棧和佇列
棧和佇列是什麼 棧和佇列是兩種特殊的線性表,它們是限定只能在表的一端或兩端進行插入、刪除元素的線性表,因此,統稱為限定性資料結構。 共同點: 都是隻能線上性表的端點插入和刪除。不同點: 棧的插入和刪除都線上性表的同一個端點,該點通稱棧頂,相應地,不能插入刪除的另一個端點通稱棧底,其特性是後進先出。
資料結構自學記錄(五):棧和佇列
棧的定義:棧是一種只能在一端進行插入或刪除操作的線性表。 棧的一些概念:1.允許進行插入、刪除操作的一端稱為棧頂。 2.表的另一端稱為棧底。 3.當棧中沒有資料元素時,稱為空棧。
【資料結構】--幾道棧和佇列面試題
用兩個棧實現一個佇列 1、思路分析 拿到這道題,會有以下幾種思路: 思路一: 入隊時,將所有的元素壓入到s1中 出隊時,將s1中的所有元素倒入到s2中,然後讓s2中棧頂的元素出棧,然後將s2中所有的元素倒入到s1中 問題所在:我們不難發現,在這種解法
資料結構(java)——棧和佇列
今天的是一些資料結構中棧和佇列的基本操作,算是作為用java描述資料結構的一個開始。之前學的都是用c語言描述,現在因為開始準備java方向的一些事情,所以打算開始過一遍java的資料結構。棧 棧的特點是,棧裡面的元素是先進後出的形式。比如把1,2,3依次放進一個棧裡面,取
資料結構第三章棧和佇列的比較
棧和佇列的比較 1.棧:僅在表尾進行插入和刪除操作的線性表;具有後進先出的特性。 後進先出的缺點:減少了棧操作的靈活性 ~~~~~~~~的優點:使得棧的操作更有效更容易實現。 2.根據儲存結構劃分,棧可分為:順序棧和鏈棧。 3.順序棧的本質是對順序表的
資料結構學習筆記9--棧和佇列的順序儲存結構
棧和佇列的相同點和不同點: 相同點:棧和佇列是兩種重要的資料結構,也是兩種特殊的線性表結構。從資料的邏輯角度看,棧和佇列是線性表;從操作的角度來看,棧和佇列的基本操作是線性表基本操作的子集,是操作受限
資料結構——30行程式碼實現棧和模擬遞迴
本文始發於個人公眾號:TechFlow,原創不易,求個關注 棧的定義 原本今天想給大家講講快速選擇演算法的,但是發現一連寫了好幾篇排序相關了,所以臨時改了題目,今天聊點資料結構,來看看經典並且簡單的資料結構——棧。 棧這個結構我想大家應該都耳熟能詳,尤其是在很多地方將和堆並列在一起,稱作“堆疊”就更廣為人
演算法與資料結構(3):基本資料結構——連結串列,棧,佇列,有根樹
原本今天是想要介紹堆排序的。雖然堆排序需要用到樹,但基本上也就只需要用一用樹的概念,而且還只需要完全二叉樹,實際的實現也是用陣列的,所以原本想先把主要的排序演算法講完,只簡單的說一下樹的概念。但在寫的過程中才發現,雖然是隻用了一下樹的概念,但要是樹的概念沒講明白的話,其實不太好理解。所以決定先介紹一下基本的資
js 實現棧和佇列
js實現棧或者佇列有兩種方式: 1.陣列:陣列本身提供棧方法(push,pop),佇列方法(push,shift)。 程式碼實現(棧): /*=======棧結構=======*/ var stack=function(){ this.data=[] this.push=push
資料結構-線性表(棧與佇列基本概念)
棧(stack,zhan):是限定僅在表尾進行插入和刪除操作的線性表。 把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出(Last In First Out)的線性表,簡稱LIFO結構。 棧是一個線性表,棧元素
C語言實現棧和佇列(棧和佇列的基本操作)
棧: 棧:棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。 特點:先進後出 stack.h #pragma once #include <stdio.h> #include <
python列表練習-用python實現棧和佇列
1.棧的工作原理:先進後出 入棧 出棧 棧頂元素 棧的長度 棧是否為空 stack = [] info = """ 棧操作 1.入棧 2.出棧 3.棧頂元素 4.棧的長度 5.棧是否為空 """ while True:
資料結構之陣列實現棧
#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define sqstack_Initsize 20#define sqstack_Increase_size 20#define OK 1#define ERROR
Java版資料結構之陣列實現棧的操作
簡介 利用陣列實現棧的操作 public class MyStack { private int[] elements; public MyStack() { elements=new int[0]; } /
Java實現棧和佇列
棧:LIFO(後進先出) 佇列:FIFO(先進先出) 棧的順序儲存結構實現: /** * 基於陣列實現的順序棧 * @param <E> */ public class Stack<E> { private Object[]