【資料結構】順序棧的實現(C語言)
棧的基本概念及其描述
棧是一種特殊的線性表,規定它的插入運算和刪除運算均線上性表的同一端進行,進行插入操作和刪除操作的那一端稱為棧頂,另一端稱為棧底。
棧的插入操作和刪除操作分別稱為進棧和出棧。
FILO(First In Last Out)後進先出/先進後出
eg.有1.2.3號火車一次進站,它們的出棧順序可以是
1.2.3(1來,1走,2來,2走,3來,3走)
2.1.3(1來,2來,2走,1走,3來,3走)
1.3.2(1來,1走,2來,3來,3走,2走)
3.2.1(1來,2來,3來,3走,2走,1走)
2.3.1(1來,2來,2走,3來,3走,1走)
棧的主要操作是插入操作和刪除操作。
棧(順序儲存)主要要掌握以下操作:
1、初始化
2、判斷棧是否為空
3、讀棧頂節點值
4、棧的插入操作
5、棧的刪除操作
執行環境:Code::Blocks 17.12
下面是標頭檔案
#ifndef SEQSTACK_H_INCLUDED #define SEQSTACK_H_INCLUDED #define MAXSIZE 100 #include "stdio.h" #include "stdlib.h" typedef int datatype; typedef struct { datatype a[MAXSIZE]; int top; }sequence_stack; //棧(順序儲存)的初始化 void init (sequence_stack *st) { st->top=0; } int isempty(sequence_stack st) { return (st.top?0:1); //如果是空的話則返回1 } //取得棧頂(順序儲存)節點值 int read(sequence_stack st) { if (isempty(st)) { printf("該棧是空的!!\n");exit(1); } else { return st.a[st.top-1]; } } //棧(順序儲存)插入操作 void push(sequence_stack *st,datatype x) { if(st->top==MAXSIZE) { printf("該棧是滿的!\n");exit(1); } st->a[st->top]=x; st->top++; } //棧(順序儲存)的刪除操作 void pop(sequence_stack *st) { if (st->top==0) { printf("該棧是空的!\n"); exit(1); } st->top--; } //判斷表示式的括號是否匹配 int match_kuohao(char c[]) { int i=0; sequence_stack s; init(&s); while(c[i]!='#') { switch(c[i]) { case '{': case '[': case '(':push(&s,c[i]);break; case '}': { if (!isempty(s) && read(s)=='{') { pop(&s);break; } else { return 0; } } case ']': { if (!isempty(s) && read(s)=='[') { pop(&s);break; } else { return 0; } } case ')': { if (!isempty(s) && read(s)=='(') { pop(&s);break; } else { return 0; } } } i++; } return (isempty(s));/*棧是空的則匹配,否則不匹配*/ } void convert(sequence_stack st,int x,int y) { init(&st); while(x>0) { push(&st,x%y); x/=y; } while(st.top) { printf("%d",read(st)); pop(&st); } printf("\n"); } void menu() { printf("\t|===================================|\t\n"); printf("\t| |\t\n"); printf("\t| 順序棧及其實現 |\t\n"); printf("\t| |\t\n"); printf("\t|===================================|\t\n"); printf("\t|有如下選項: |\t\n"); printf("\t|===================================|\t\n"); printf("\t|【1】棧的初始化 |\t\n"); printf("\t|【2】判斷棧是否為空 |\t\n"); printf("\t|【3】取得棧頂的節點值 |\t\n"); printf("\t|【4】棧的插入操作 |\t\n"); printf("\t|【5】棧的刪除操作 |\t\n"); printf("\t|【6】進位制轉換 |\t\n"); printf("\t|【7】判斷表示式括號是否匹配 |\t\n"); printf("\t|===================================|\t\n"); printf("\t|Ctrl+C結束該程式!!! |\t\n"); printf("\t|===================================|\t\n"); } #endif // SEQSTACK_H_INCLUDED
下面是主程式
#include "stdio.h" #include "seqstack.h" int main () { sequence_stack st; int i,k; datatype a; char str[100]; while(1) { menu(); printf("\n\n請輸入你的選擇:"); scanf("%d",&i); switch (i) { case 1: { init(&st); break; } case 2: { if(isempty(st)) printf("該順序棧為空。"); else printf("該順序表不是空棧。"); printf("已進行判斷。\n\n");break; } case 3: { printf("%d",read(st)); printf("\n成功列印順序棧頂的節點值。\n\n"); break; } case 4: { printf("請輸入一個想要插入的數:"); scanf("%d",&a); push(&st,a); break; } case 5: { pop(&st); printf("棧頂節點已成功刪除!\n"); printf("還剩下%d個節點\n",st.top); break; } case 6: { printf("請輸入一個數字,以及想要轉化為的進位制:"); scanf("%d%d",&a,&k); convert(st,a,k); break; } case 7: { printf("以“#”結束\n\n"); scanf("%s",str); if(match_kuohao(str)) { printf("配對!\n\n"); } else { printf("不配對!\n\n"); } break; } } } return 0; }
相關推薦
【資料結構】順序棧的實現(C語言)
棧的基本概念及其描述 棧是一種特殊的線性表,規定它的插入運算和刪除運算均線上性表的同一端進行,進行插入操作和刪除操作的那一端稱為棧頂,另一端稱為棧底。 棧的插入操作和刪除操作分別稱為進棧和出棧。 FILO(First In Last Out)後進先出/先進後出 eg
【資料結構】順序表實現十進位制轉換任意進位制
/* & File : 進位制準換 * Author : Laugh * Copyright: Laugh * 主題 :對於輸入的任意一個非負十進位制小數,列印輸出與其等值的任意進位制小數 * Date : 2018/10/14 */
【資料結構】利用棧實現表示式求值
前言 java實現,利用int型別儲存運算元,完善了char類型範圍太小的問題,利用遞迴,完善了括號巢狀使用的問題。 執行結果截圖 程式碼實現: import java.util.Arrays; import java.util.Scanner; public
【資料結構】順序棧 Stack
#include "calculator.h" #include <iostream> using namespace std; //construction Calculator::Calculator(){ command=' '; } //get_command void Calcul
【作業系統】銀行家演算法實現(C語言)
# 【作業系統】銀行家演算法實現(C語言) ##### 注意:本人編碼水平很菜。算是自己的一個總結。可能會有我還沒有發現的bug。如果有人發現後可以指出,不勝感激。 ## 1.銀行家演算法: > 我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於
佇列的順序表實現(C語言)
#include <stdio.h> #include <stdlib.h> struct QueueRecord; typedef struct QueueRecord* Queue; typedef int ElementType;
【資料結構】順序佇列的實現(C語言)
佇列的基本概念及其描述 佇列是一種特殊的線性表,它的特殊性在於佇列的插入和刪除操作分別在表的兩端進行。 插入的那一端稱為隊尾,刪除的那一端稱為隊首。佇列的插入操作和刪除操作分別稱為進隊和出隊。 先進先出(First In First Out) 順序佇列要掌握以下操作:
【資料結構】鏈式棧的實現(C語言)
棧的鏈式儲存稱為鏈式棧,鏈式棧是一種特殊的單鏈表,它的插入和刪除規定在單鏈表的同一端進行。鏈式棧的棧頂指標一般用top表示。(個人理解:相當於只對單鏈表的第一個結點進行操作) 鏈式棧要掌握以下基本操作: 1、建立一個空鏈式棧 2、判斷鏈式棧是否為空 3、讀鏈式棧的
【資料結構】二叉樹(順序儲存、鏈式儲存)的JAVA程式碼實現
二叉樹是一種非線性的資料結構。它是由n個有限元素的集合,該集合或者為空、或者由一個稱為根(root)的元素及兩顆不相交的、被分別稱為左子樹、右子樹的二叉樹組成。當集合為空時,稱該二叉樹為空二叉樹。在二叉樹中,一個元素也可以稱做一個結點。二叉樹是有序的,即若將其左右兩個子樹顛倒
【資料結構】順序表的應用(1)
問題: 1.將順序表(a1,a2,…,an)重新排列以a1為界的兩部分:a1前面的值均比a1小,a1後面的值均比a1大(這裡假設資料元素的型別具有可比性,不妨設為整型)。 #include "
【資料結構】順序表的應用(2)
問題: 2.有順序表A和B,其元素均按從小到大的升序排列,編寫一個演算法,將它們合併成一個順序表C,要求C的元素也按從小到大的升序排列。 #include "stdio.h" #include "sequlist.h" int main () { int le
【資料結構】順序表的應用(3)
問題: 已知一個順序表中的各節點值是從大到小有序的,設計一個演算法,插入一個值為x的節點,使順序表中的節點仍然是從小到大有序的。 #include "stdio.h" #include "seq
【Java資料結構】用棧實現字尾表示式求值
今天在學資料結構,自己擼一段用棧來實現字尾表示式求值的程式碼,能改進的地方還有很多,在此先mark一下 package StackPractice; import java.util.Scanner; import java.util.Stack; im
【資料結構】順序表及其各個介面的實現
在聊順序表之前,我們先來說一下線性表。 什麼是線性表呢? 線性表是n個具有相同特性的資料元素的有限序列。線性表是一種在實際中廣泛使用的資料結構,常見的線性表有:順序表,連結串列,棧,佇列,字串.... 線性表在邏輯上是線性結構,也就是說是連續的一條直線。但在物理結構上並不一定是連續的,線
【資料結構】紅黑樹(如何實現及怎樣判斷)
紅黑樹是一顆二叉搜尋樹,它在每個節點上增加了一個儲存位來表示節點的顏色,可以是red或black。通過對任何一條從根節點到葉子節點的簡單路徑上的顏色來約束,紅黑樹保證了最長路徑不超過最短路經的兩倍,因此近似於平衡。 紅黑樹的規則: 1、每個節點不是紅色就是
【資料結構】希爾排序(ShellSort)
概念: 希爾排序法,又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數, 把待排序檔案中所有資料分成幾個組,所有距離為gap的資料分在同一組內,並對每一組內的資料進行排序。 然後,去重複上述分組和排序的工作。當到達gap=1時,所有資料在一組內
【資料結構】基礎知識點整理(4)
1.順序表提供隨機讀取功能,不需要經過指標的頻繁跳轉,儲存效率很高。 2.線性表的順序儲存結構是一種隨機存取的儲存結構,鏈式儲存結構是一種順序存取的儲存結構,順序儲存指記憶體地址是一塊的,隨機存取是指訪問時可以按下標隨機訪問。 3.在棧中,棧頂指標的動態變化決定棧中元素的個數;在鏈式儲存結構
【資料結構】堆的實現
文章目錄 Heap.h Heap.c Test.c Heap.h #ifndef __HEAP_H__ #define __HEAP_H__ #include<assert.h> #include
【資料結構】順序表的操作函式
SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <assert.h> #include <malloc.h> #include <window
【資料結構】順序表應用1:多餘元素刪除之移位演算法
Problem Description 一個長度不超過10000資料的順序表,可能存在著一些值相同的“多餘”資料元素(型別為整型),編寫一個程式將“多餘”的資料元素從順序表中刪除,使該表由一個“非純表