1. 程式人生 > >資料結構-棧和佇列——20150602

資料結構-棧和佇列——20150602

//順序棧定義及實現
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//函式結果狀態程式碼
#define  TRUE                 1
#define  FALSE                0
#define   OK                  1
#define  ERROR                0
#define  INFEASIBLE           -1
#define  OVERFLOW             -2
#define  STACK_INIT_SIZE      100
#define  STACKINCREMENT       10


typedef int Status;
typedef char SElemType;
typedef struct {
			SElemType*base;
			SElemType*top;
			int stacksize;
}Stack;
void CopySElemType(SElemType&s,SElemType e)
{
      s=e;
}
Status InitStack(Stack &S)
{
      //建立一個空棧;
      S.base=(SElemType*)malloc(sizeof(SElemType));
      if(!S.base)exit(OVERFLOW);
      S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}
Status DestroyStack(Stack&S)
{
      free(S.base);S.top=NULL;S.base=NULL;S.stacksize=0;return OK;
}
void ClearStack(Stack&S)
{
      S.top=S.base;S.stacksize=STACK_INIT_SIZE;
}
Status EmptyStack(Stack S)
{
      if(S.top-S.base)return FALSE;
      return OK;
}
Status Push(Stack &S,SElemType e)
{
      if(S.top-S.base==S.stacksize)
      {
            Stack SS;SS.top=(SElemType*)realloc(S.base,sizeof(S.stacksize+STACKINCREMENT));
            if(!SS.base)exit(OVERFLOW);
            free(S.base);S.base=SS.base;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;
      }
      CopySElemType(*S.top,e);S.top++;return OK;
}
Status Pop(Stack &S,SElemType &e)
{
      if(S.top==S.base)return ERROR;
      CopySElemType(e,*(S.top-1));--S.top;
      return OK;
}
Status GetTop(Stack S,SElemType&e)
{
      if(S.top==S.base)return FALSE;
      CopySElemType(e,*(S.top-1));return OK;
}
Status SetTop(Stack&S,SElemType e)
{
      if(EmptyStack(S))return FALSE;
      CopySElemType(*(S.top-1),e);return OK;
}





對於鏈式棧可以用如下的定義方式
 typedef struct SNode{  
      SElemType data;
      struct SNode *next;
 }SNode, *LinkStack;
具體實現,以後有時間再加!
2、佇列概念: 佇列類似線性表和棧,也是定義線上性結構上的ADT,與線性表和棧的區別在於,元素的插入和刪除分別在表的兩端進行。
類似日常生活中排隊,允許插入的一端為隊尾(rear),允許刪除端稱隊頭(front)
特性:First In First Out先進先出,如作業系統中的作業佇列和列印任務佇列、日常生活中各類排隊業務等均可用佇列模擬
佇列一般也有兩種儲存形式,鏈式佇列和順序佇列(迴圈佇列),這裡我只寫了鏈式佇列的,另一種以後補充。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include"stack_sq.h"


#define  TRUE                 1
#define  FALSE                0
#define   OK                  1
#define  ERROR                0
#define  INFEASIBLE           -1
#define  OVERFLOW             -2


typedef int Status;
typedef char QElemType;
typedef struct QNode{
      QElemType data;
      struct QNode*next;
}QNode,*QueuePtr;
typedef struct{
      QueuePtr front;
      QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue&Q)
{
      Q.front=(QNode*)malloc(sizeof(QNode));
      if(!Q.front)exit(OVERFLOW);
      Q.rear=Q.front;Q.front->next=NULL;
      return OK;
}
Status DestroyQueue(LinkQueue&Q)
{
      QNode*p=Q.front->next;
      while(p)
      {
            Q.front->next=p->next;free(p);
            p=Q.front->next;
      }
      free(Q.front );Q.front=Q.rear=NULL;
      return OK;
}
Status ClearQueue(LinkQueue&Q)
{
      QueuePtr p=Q.front->next;
      while(p)
      {
            Q.front->next=p->next;
            free(p);p=Q.front->next;
      }
      Q.rear=Q.front;return OK;
}
Status EnQueue(LinkQueue&Q,QElemType e)
{
      QueuePtr p;p=(QNode*)malloc(sizeof(QNode));
      if(!p)exit(OVERFLOW);
      p->next=NULL;p->data=e;
      Q.rear->next=p;Q.rear=p;return OK;
}
Status DeQueue(LinkQueue&Q,QElemType&e)
{
      if(Q.rear==Q.front)return FALSE;
      QueuePtr p=Q.front->next;e=p->data;
      Q.front->next=p->next;
      if(p==Q.rear)Q.rear=Q.front;
      return OK;
}
下面是學習的時候做過的一個判斷是不是迴文的程式碼,一起附上吧。
#include"queue_L.h"


Status HuiWen(QElemType *p)
{
      LinkQueue Q;Stack S;SElemType se;QElemType qe;
      if(InitQueue(Q));if(InitStack(S));
      while(*p!='@'&&*p!='\n')
      {
            if(EnQueue(Q,*p));if(Push(S,*p));++p;
      }
      while(Pop(S,se)&&DeQueue(Q,qe))
      {
            if(se!=qe){printf("不是迴文。");return FALSE;}
      }
      printf("是迴文。");return OK;
}
int main()
{
      char s[100]="
[email protected]
"; if(HuiWen(s)); return 0; }

ps:雖然簡單,但也是我當年一個一個程式碼敲上去的,還望各位用心指教。

相關推薦

資料結構-佇列——20150602

//順序棧定義及實現 #include<stdio.h> #include<malloc.h> #include<stdlib.h> //函式結果狀態程式碼 #define TRUE 1 #define

資料結構 - 佇列

資料結構 - 棧和佇列 介紹 棧和佇列是兩種很簡單, 但也很重要的資料結構, 在之後的內容也會用到的

資料結構---佇列結構體實現)

棧(LIFO) 棧(stack)是一種只能在一端進行插入或刪除操作的線性表。 棧頂(top):允許進行插入、刪除操作的一端 棧底(bottom):另一端稱為棧底 進棧或入棧(push):插入操作 出棧或退棧(pop):棧的刪除操作 n個不同元素通過一個棧產生的出棧

資料結構---佇列(例題、練習及解答)

棧的應用 Q1:簡單表示式求值 限定的簡單表示式求值問題是使用者輸入一個包含+、-、*、/、正整數和圓括號的合法算術表示式,計算該表示式的結果。 思路:(1)將算術表示式轉換成字尾表示式 (2)字尾表示式求值 具體執行程式碼: #include <

資料結構——佇列

棧和佇列 一、選擇題 ~~01|03|1|1 ^^設有一個遞迴演算法如下 int fact(int n) { //n大於等於0 if(n<=0) return 1; else return n*fact(n-1); } 則計算fact(n)

資料結構佇列、遞迴演算法

知識要點: 棧的定義、結構特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法; 佇列的結構、特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法。 遞迴的基本概念和實現原理以及用遞迴的思想描述問題和書寫演算法的方法; 用棧實現遞迴問題的非遞迴解法。

資料結構 佇列

文章目錄 1 棧 1.1 抽象資料型別棧的定義 1.1.1 棧頂和棧尾 1.1.2 空棧 1.1.3 特點 1.1.4 上溢和下溢 1.2 棧的表示和實現 1.2.1

資料結構佇列(五)的順序儲存結構鏈式儲存結構的實現

一、 實驗目的1. 熟悉棧的特點(先進後出)及棧的抽象類定義;2. 掌握棧的順序儲存結構和鏈式儲存結構的實現;3. 熟悉佇列的特點(先進先出)及佇列的抽象類定義;4. 掌握棧的順序儲存結構和鏈式儲存結構的實現;二、實驗要求1. 複習課本中有關棧和佇列的知識;2. 用C++語言

還債系列之資料結構——佇列

三、棧 還記得當初第一次學習程式設計的時候還是8051微控制器中的組合語言,現在還記得很清楚,當初遇到的一個簡單的資料結構就是——棧,對應的組合語言中的命令是push和pop。這個結構在生活中是有很多類似的例子的,比如水杯、碗等。該結構的特點如下: 最大特

資料結構-佇列面試題(下)

面試題四:元素出棧、入棧順序的合法性。如入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)。 思路: ①首先判斷出棧入棧序列長度是否一致,不一致直接返回false; ②借用一個臨時的棧,依次遍歷入棧序列的每一個元素,每次

資料結構 佇列 演算法設計題

五 演算法設計題 1. 設有兩個棧S1,S2都採用順序棧方式,並且共享一個儲存區[O..maxsize-1],為了儘量利用空間,減少溢位的可能,可採用棧頂相向,迎面增長的儲存方式。試設計S1,S2有關入棧和出棧的操作演算法。 【哈爾濱工業大學 2001 七 (12分)】 2

資料結構:佇列-迷宮問題求解

//--------------------檔名:Maze.cpp------------------------//----------------------By SunxySong-------------------------//說明:本程式以迷宮問題進行演示,瞭解

資料結構--佇列的面試題

實現一個棧,要求實現Push(出棧)、Pop(入棧)、Min(返回最小值)的時間 複雜度為O(1) 方法1、棧Push時:當棧為空時,push兩次第一個資料。棧頂的數來儲存當前狀態的最小值。 再次Push資料時候,先拿將要Push的資料與棧頂的最小值進行比較,更

資料結構-佇列小結

1棧   1>棧的定義:       棧是限定僅在表尾進行插入和刪除操作的線性表。       我們把插入和刪除的一端稱為棧頂(TOP),另一端稱為棧底(BOTTOM),不包含任何元素的棧稱為空棧。棧又稱為後進先出(Last in first out)的線性表,簡稱L

資料結構-佇列面試題(上)

在資料結構的學習過程中,棧和佇列的掌握是十分重要的。所以找了幾個很熱門的面試題試試手並小結一下。先回顧下棧和佇列的特性:棧是後進先出,主要介面有PUSH,POP,TOP,而佇列是先進先出,主要介面有PU

C資料結構-佇列,括號匹配舉例---ShinePans

1.棧和佇列是兩種特殊的線性表             運算操作被限定只能在表的一端或兩端插入,刪除元素,故也稱它們為限定的線性表結構 2.棧的基本運算 1).Stackinit(&s) 構造一個空棧 2).Stackempty(s) 判斷s是否為空棧,當s為空棧

資料結構-佇列

                  &n

線性結構 -- 佇列

線性結構 – 棧和佇列 線性結構是一個有序資料元素的集合。 常用的線性結構有:線性表,棧,佇列,雙佇列,陣列,串。 常見的非線性結構有:二維陣列,多維陣列,廣義表,樹(二叉樹等),圖。 特徵: 1.集合中必存在唯一的一個"第一個元素"; 2.集合中必存在唯一的一個"最後的元素

資料結構-佇列

棧的定義 棧是限定僅在表尾進行插入和刪除操作的線性表 我們把允許插入和刪除的一端稱為棧頂 (top) ,另一端稱為棧底 (bottom) ,不含任何資料元素的棧稱為空棧。 棧又稱為後進先出 (Last In Filrst Out) 的線性表,簡稱LIFO結構。 理解棧的定義需要注意:

資料結構--佇列

一、定義 1、棧的操作   注意:棧的插入和刪除改名叫push和pop   2、棧的順序儲存結構和實現 1)進棧操作 2)出棧的操作 3、兩棧共享空間 注意: