1. 程式人生 > >資料結構演算法程式碼實現——棧和佇列(一)

資料結構演算法程式碼實現——棧和佇列(一)

棧和佇列

棧和佇列是一種特殊的線性表。
從資料結構角度看:棧和佇列也是線性表,其特點性在於棧和佇列的基本操作是線性表操作的子集。它們是操作受限的線性表。
從資料型別角度看:它們是和線性表不相同的兩類重要的抽象資料型別。

棧的定義

棧(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[]