數據結構實驗3.1:順序棧的基本操作與進制轉換

文章目錄

  • 一,問題描述
  • 二,基本要求
  • 三,算法分析
  • 四,示例代碼
  • 五,實驗操作
  • 六,運行效果


一,問題描述

在數據處理中,常常會遇到需要對鏈接存儲的線性表進行操作的情況。本次任務聚焦于將鏈接存儲的線性表進行逆置。具體來說,就是要改變線性表中結點的順序,使得原來的最后一個結點變為新線性表的第 1 個結點,原來倒數第 2 個結點變為新線性表的第 2 個結點,依此類推,從而實現整個線性表的逆置。

二,基本要求

  1. 算法分析與設計:對鏈表逆置問題進行深入分析,考慮到可能存在帶附加表頭結點和不帶附加表頭結點這兩種不同情況。對于帶附加表頭結點的鏈表,表頭結點不存儲實際數據,僅作為鏈表的起始標志,在逆置過程中需要特殊處理,以保證表頭結點的位置和指向關系正確;對于不帶附加表頭結點的鏈表,逆置時要特別注意第一個結點的處理,以及如何正確更新指針,確保鏈表的完整性和正確性。分別設計出針對這兩種情況的高效算法,明確算法的邏輯步驟和操作流程。
  2. 編寫完整上機程序:使用 C++ 語言,根據設計好的算法,編寫完整的程序代碼。在程序中,要清晰地定義鏈表的節點結構,包括數據域和指針域。實現鏈表的創建、逆置以及輸出等功能函數,確保函數之間的調用關系正確,代碼結構清晰易讀。同時,要合理處理內存分配和釋放問題,避免內存泄漏。
  3. 設計測試用例并上機驗證:精心設計多種測試用例,涵蓋不同長度的鏈表、包含不同數據的鏈表以及特殊情況(如空鏈表、只有一個結點的鏈表等)的鏈表。通過上機運行程序,輸入各種測試用例,觀察程序的運行結果,驗證程序是否能夠正確地對鏈表進行逆置操作。
  4. 記錄測試結果,對測試結果進行分析:詳細記錄每個測試用例的輸入和輸出結果,包括鏈表的原始狀態和逆置后的狀態。對測試結果進行深入分析,檢查程序在不同情況下的運行是否符合預期,是否存在邏輯錯誤或異常情況。比較帶附加表頭結點和不帶附加表頭結點兩種情況下算法的執行效率、代碼復雜度等方面的差異,總結兩種方法的優缺點,為今后在實際應用中選擇合適的鏈表結構和算法提供參考。

三,算法分析

  1. 不帶附加表頭結點的鏈表逆置算法
    • 初始化三個指針:prev 指向 NULL,表示當前結點的前一個結點;curr 指向鏈表的頭結點,即第一個實際存儲數據的結點;next 用于臨時存儲 curr 的下一個結點。
    • 遍歷鏈表,在每次循環中,先將 next 指向 curr 的下一個結點,然后將 currnext 指針指向 prev,更新 prevcurrcurrnext
    • curr 變為 NULL 時,說明已經遍歷到鏈表的末尾,此時 prev 指向的就是逆置后鏈表的頭結點,完成逆置操作。
  2. 帶附加表頭結點的鏈表逆置算法
    • 同樣初始化三個指針:prev 指向附加表頭結點;curr 指向附加表頭結點的下一個結點,即第一個實際存儲數據的結點;next 用于臨時存儲 curr 的下一個結點。
    • 遍歷鏈表,在每次循環中,先將 next 指向 curr 的下一個結點,然后將 currnext 指針指向 prev,更新 prevcurrcurrnext
    • curr 變為 NULL 時,說明已經遍歷到鏈表的末尾,此時需要將附加表頭結點的 next 指針指向 prev,完成逆置操作。注意在整個過程中,附加表頭結點始終存在且位置不變,只是其 next 指針指向發生了變化。

四,示例代碼

#define STACK_INIT_SIZE  100    // 棧存儲空間初始分配量
#define STACKINCREMENT  10     // 棧存儲空間分配增量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#include "stdio.h"
#include "malloc.h"
#include <stdlib.h>  // 添加這一行,引入 exit 函數的定義typedef int status;
typedef char SelemType;typedef struct {                       // 順序棧的定義SelemType *base;SelemType *top;int stacksize;
} SqStack;status InitStack(SqStack &S) {        // 構造一個空棧 SS.base = (SelemType *)malloc(STACK_INIT_SIZE * sizeof(SelemType));if (!S.base)exit(OVERFLOW);       // 存儲分配失敗S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;
}status Push(SqStack &S, SelemType e) {// 插入元素 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;S.top++;return OK;
}status Pop(SqStack &S, SelemType &e) {// 若棧不空,則刪除 S 的棧頂元素,用 e 返回其值,并返回 OK;否則返回 ERRORif (S.top == S.base)return ERROR;S.top--;e = *(S.top);return OK;
}status StackEmpty(SqStack S) {         // 判斷棧 S 是否為空if (S.top == S.base)return TRUE;elsereturn FALSE;
}void conversion() {                    // 進制轉換// 對于輸入的任意一個非負十進制整數,打印輸出與其等值的對應的進制數SqStack S;int N, d, ys;SelemType x, e;InitStack(S);                      // 構造空棧while (1) {printf("請輸入一個非負十進制數(0結束):");scanf("%d", &N);if (N == 0)break;printf("請輸入要轉換的進制:");scanf("%d", &d);   // 2、8 或 16 進制while (N) {                    // 輸出相應的符號ys = N % d;     // 求余if (ys <= 9)x = ys + '0';elsex = ys - 10 + 'A';Push(S, x);N = N / d;      // 求商}printf("轉換所得%d進制數為:", d);while (!StackEmpty(S)) {              // 顯示結果Pop(S, e);printf("%c", e);}printf("\n");}
}void main() {conversion();
}    

五,實驗操作

1.雙擊程序圖標,啟動程序。
在這里插入圖片描述

2.新建項目。
在這里插入圖片描述
3.選擇”空項目“——輸入項目名稱——單擊”確認“按鈕。
在這里插入圖片描述
4.右擊”源文件“——”添加“——選擇”新建項“。
在這里插入圖片描述

5.選擇”C++文件“——輸入文件名——單擊”添加“按鈕。
在這里插入圖片描述
6.編寫代碼。
在這里插入圖片描述

7.編譯代碼。
在這里插入圖片描述

8.查看編譯結果。
在這里插入圖片描述

9.單擊綠色小三角,運行項目。
在這里插入圖片描述

六,運行效果

1.要求效果。
在這里插入圖片描述

2.編寫程序,運行效果。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75073.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75073.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75073.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現

目錄 經典頻域分析法(Bode圖、Nyquist判據) —— 理論、案例與交互式 GUI 實現一、引言二、經典頻域分析方法的基本原理2.1 Bode 圖分析2.2 Nyquist 判據三、數學建模與公式推導3.1 一階系統的頻域響應3.2 多極系統的 Bode 圖繪制3.3 Nyquist 判據的數學描述四、經典頻域分析…

Vue知識點(5)-- 動畫

CSS 動畫是 Vue3 中實現組件動畫效果的高效方式&#xff0c;主要通過 CSS transitions 和 keyframes 動畫 CSS Keyframes&#xff08;關鍵幀動畫&#xff09; 用來創建復雜的動畫序列&#xff0c;可以精確控制動畫的各個階段。 核心語法&#xff1a; keyframes animationNa…

小型園區網實驗

劃分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool

使用LangChain Agents構建Gradio及Gradio Tools(6)——創建自己的GradioTool 本篇摘要16. 使用LangChain Agents構建Gradio及Gradio Tool16.6 創建自己的GradioTool16.6.1 創建步驟16.6.2 創建示例StableDiffusionTool參考文獻本章目錄如下: 《使用LangChain Agents構建Grad…

SDL顯示YUV視頻

文章目錄 1. **宏定義和初始化**2. **全局變量**3. **refresh_video_timer 函數**4. **WinMain 函數**主要功能及工作流程&#xff1a;總結&#xff1a; 1. 宏定義和初始化 #define REFRESH_EVENT (SDL_USEREVENT 1) // 請求畫面刷新事件 #define QUIT_EVENT (SDL…

AnimateCC基礎教學:隨機抽取花名冊,不能重復

一.核心代碼: this.btnStartObj.addEventListener("click", switchBtn); this.btnOkObj.addEventListener("click", oKBtn); createjs.Ticker.addEventListener("tick", updateRandom); var _this this; var nameArr ["張三", &quo…

軟考 系統架構設計師系列知識點 —— 設計模式之抽象工廠模式

本文內容參考&#xff1a; 軟考 系統架構設計師系列知識點之設計模式&#xff08;2&#xff09;_系統架構設計師中考設計模式嗎-CSDN博客 https://baike.baidu.com/item/%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/2361182 特此致謝&#xff01; Abstract Fac…

P2040 打開所有的燈

題目背景 pmshz在玩一個益(ruo)智(zhi)的小游戲&#xff0c;目的是打開九盞燈所有的燈&#xff0c;這樣的游戲難倒了pmshz。。。 題目描述 這個燈很奇(fan)怪(ren)&#xff0c;點一下就會將這個燈和其周圍四盞燈的開關狀態全部改變。現在你的任務就是就是告訴pmshz要全部打開…

漢得企業級 PaaS 平臺 H-ZERO 1.12.0 發布!四大維度升級,構建企業數字化新底座

漢得企業級 PaaS 平臺&#xff08;以下簡稱"H-ZERO"&#xff09;是一款基于微服務架構的企業級數字化 PaaS 平臺&#xff0c;可支持企業各類系統搭建、產品研發&#xff0c;幫助企業快速構架技術中臺。 H-ZERO于2025年3月底正式發布 V1.12.0 &#xff0c;此次發布聚…

ReplicaSet、Deployment功能是怎么實現的?

在Kubernetes中&#xff0c;ReplicaSet 和 Deployment 是用于管理 Pod 副本的關鍵對象。它們各自的功能和實現機制如下&#xff1a; 1. ReplicaSet 功能 管理 Pod 副本&#xff1a;確保指定數量的 Pod 副本一直在運行。如果有 Pod 副本崩潰或被刪除&#xff0c;ReplicaSet 會…

物聯網外設管理服務平臺

1 開發目標 1.1 架構圖 操作系統&#xff1a;基于Linux5.10.10源碼和STM32MP157開發板&#xff0c;完成tf-a(FSBL)、u-boot(SSBL)、uImage、dtbs的裁剪&#xff1b; 驅動層&#xff1a;為每個外設配置DTS并且單獨封裝外設驅動模塊。其中電壓ADC測試&#xff0c;采用linux內核…

PyTorch教程:如何讀寫張量與模型參數

本文演示了PyTorch中張量&#xff08;Tensor&#xff09;和模型參數的保存與加載方法&#xff0c;并提供完整的代碼示例及輸出結果&#xff0c;幫助讀者快速掌握數據持久化的核心操作。 1. 保存和加載單個張量 通過torch.save和torch.load可以直接保存和讀取張量。 import to…

持續集成:GitLab CI/CD 與 Jenkins CI/CD 的全面剖析

一、引言 在當今快速迭代的軟件開發領域,持續集成(Continuous Integration,CI)已成為保障軟件質量、加速開發流程的關鍵實踐。通過頻繁地將代碼集成到共享倉庫,并自動進行構建和測試,持續集成能夠盡早發現并解決代碼沖突和缺陷。而 GitLab CI/CD 和 Jenkins CI/CD 作為兩…

Python 序列構成的數組(序列的增量賦值)

序列的增量賦值 增量賦值運算符 和 * 的表現取決于它們的第一個操作對象。簡單起 見&#xff0c;我們把討論集中在增量加法&#xff08;&#xff09;上&#xff0c;但是這些概念對 * 和其他 增量運算符來說都是一樣的。 背后的特殊方法是 iadd &#xff08;用于“就地加法”&…

GEO, TCGA 等將被禁用?!這40個公開數據庫可能要小心使用了

GEO, TCGA 等將被禁用&#xff1f;&#xff01;這40個公開數據庫可能要小心使用了 最近NIH公共數據庫開始對中國禁用的消息鬧得風風火火&#xff1a; 你認為研究者上傳到 GEO 數據庫上的數據會被禁用嗎&#xff1f; 單選 會&#xff0c;畢竟占用存儲資源 不會&#xff0c;不…

【如何自建MCP服務器?從協議原理到實踐的全流程指南】

文章目錄 如何自建MCP服務器&#xff1f;從協議原理到實踐的全流程指南一、MCP協議是什么&#xff1f;核心架構 二、為什么要自建MCP服務器&#xff1f;1. 突破LLM的固有局限2. 實現個性化功能擴展3. 確保數據隱私安全 三、手把手搭建MCP服務器&#xff08;Python示例&#xff…

鴻蒙開發_ARKTS快速入門_語法說明_渲染控制---純血鴻蒙HarmonyOS5.0工作筆記012

然后我們再來看渲染控制 首先看條件渲染,其實就是根據不同的狀態,渲染不同的UI界面 比如下面這個暫停 開啟播放的 可以看到就是通過if 這種條件語句 修改狀態變量的值 然后我們再來看這個, 下面點擊哪個,上面橫線就讓讓他顯示哪個 去看一下代碼 可以看到,有兩個狀態變量opt…

【Java設計模式】第3章 軟件設計七大原則

3-1 本章導航 學習開辟原則(基礎原則)依賴倒置原則單一職責原則接口隔離原則迪米特法則(最少知道原則)里氏替換原則合成復用原則(組合復用原則)核心思想: 設計原則需結合實際場景平衡,避免過度設計。設計模式中可能部分遵循原則,需靈活取舍。3-2 開閉原則講解 定義 軟…

JVM即時編譯(JIT)

JVM基礎回顧 Java 作為一門高級程序語言&#xff0c;由于它自身的語言特性&#xff0c;它并非直接在硬件上運行&#xff0c;而是通過編譯器(前端編譯器)將 Java 程序轉換成該虛擬機所能識別的指令序列&#xff0c;也就是字節碼&#xff0c;然后運行在虛擬機之上的&#xff1b;…

剛體碰撞檢測與響應(C++實現)

本文實現一個經典的物理算法&#xff1a;剛體碰撞檢測與響應。這個算法用于檢測兩個剛體&#xff08;如矩形或圓形&#xff09;是否發生碰撞&#xff0c;并在碰撞時更新它們的速度和位置。我們將使用C來實現這個算法&#xff0c;并結合**邊界框&#xff08;Bounding Box&#x…