1. 程式人生 > >【資料結構】順序棧的實現(C語言)

【資料結構】順序棧的實現(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資料的順序表,可能存在著一些值相同的“多餘”資料元素(型別為整型),編寫一個程式將“多餘”的資料元素從順序表中刪除,使該表由一個“非純表