日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实验一 线性表、堆栈和队列的操作与实现

發布時間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验一 线性表、堆栈和队列的操作与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

記錄實驗,同時也是記錄常見數據結構算法的實現。


廣州大學學生實驗報告

開課實驗室:計算機科學與工程實驗(電子樓418A)
學院 計算機科學與網絡工程學院
實驗課程 數據結構實驗
實驗項目 實驗一 線性表、堆棧和隊列的操作與實現

  • 一、實驗目的:
    1、線性表的鏈表實現:遍歷、查找、插入、刪除、翻轉
    2、棧的鏈式存儲結構實現:入棧、出棧
    3、隊列的鏈式存儲結構的實現:入隊、出隊
    4、線性表、棧和隊列的應用實現
  • 二、使用儀器、器材
    微機一臺
    操作系統:WinXP
    編程軟件:C++
  • 三、實驗內容及原理
    1、線性表的鏈表實現:(返回目錄🖱)
// DataStruct_experiment.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 // StructExperiment.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。#include <iostream> #include <ctime> #include <iomanip> using namespace std;typedef struct LNode {int data;LNode* next; }LNode, * LinkList;//插入 void Insert(LinkList &l, LNode* new_node, int n) {// 頭結點處不可插入值。判斷插入的位置是否為頭結點while (1){if (n == 0){cout << "0處是頭結點,請重新輸入你想插入整數的位置\t位置: ";cin >> n;}else if (n > 11 || n < 1){cout << "輸入的位置超出鏈表的長度,請重新輸入...\t位置: ";cin >> n;}else break;}// 尋找n-1處的節點LNode* p = new LNode;p = l;if (p == NULL){cout << "空表,退出程序......";exit(0);}int i = 0;while (i < n - 1 && p){p = p->next;++i;}// 在n處插入新節點,使原來在n處的節點變成n+1new_node->next = p->next;p->next = new_node;cout << "在 " << setw(2) << n << " 處插入值為 " << new_node->data << " 的節點" << endl; }//輸出鏈表的內容 void List_show(LinkList& l) {// 判斷鏈表是否為空if (!(l->next)){cout << "出錯,此鏈表為空鏈表,退出程序......";exit(0);}else{LNode* p = new LNode;p = l->next;cout << "鏈表為:";for (int i = 1; p; i++){if (p->next)cout << p->data << "——";else cout << p->data << "\t長度為:" << i << endl;p = p->next;}} }//查找 void Search_in_list(LinkList& l) {int element;cout << "請輸入你想查找的整數: " << endl;cout << "————若想退出查找,請輸入0————" << endl;LNode* p = new LNode;p = l->next;if (!p){cout << "出錯,此鏈表為空鏈表,退出程序......";exit(0);}else{while (cin >> element){if (element == 0){cout << "退出查找......" << endl;break;}else{int index_not_in = 0; //用于判斷查找的值是否在鏈表中for (int i = 1; p; i++){if (p->data == element){cout << "該整數在表中,且位置為" << i << endl;cout << "請再次輸入你想查找的整數: " << endl;cout << "————若想退出查找,請輸入0————" << endl;}else ++index_not_in;p = p->next;if (i == index_not_in && p == NULL) //到達鏈尾時,如果還找不到,說明這個整數不在這個鏈表中{cout << "整數" << element << "不在此鏈表中" << endl;cout << "請再次輸入你想查找的整數: " << endl;cout << "————若想退出查找,請輸入0————" << endl;}}}p = l->next;}} }//刪除 void Delete(LinkList& l) {// 頭結點處無數據,且不可刪除。判斷要刪除的位置是否為頭結點int n;cin >> n;while (1){if (n == 0){cout << "0處是頭結點,請重新輸入你想刪除的結點的位置\t位置: ";cin >> n;}else if (n > 10 || n < 1){cout << "輸入的位置超出鏈表的長度,請重新輸入...\t位置: ";cin >> n;}else{cout << endl;break;}}// 尋找n處的節點LNode* p = new LNode;p = l;int i = 0;if (p->next == NULL){cout << "出現錯誤,退出程序......";exit(0);}while (i < n - 1 && p){p = p->next;++i;}// 刪除n處的結點,使原來在n-1處的節點變成nLNode* temp_p = p->next;p->next = p->next->next;cout << "在 " << setw(2) << n << " 處刪除值為 " << temp_p->data << " 的節點" << endl;delete temp_p; }// 翻轉 void Reverse(LinkList& l) {LNode* p = new LNode;p = l;p = p->next; // p為鏈表中的第一個結點if (p == NULL){cout << "該鏈表為空鏈表,退出程序......";exit(0);}LNode* p_backward, * p_forward;p_backward = NULL;while (p){p_forward = p->next;p->next = p_backward;p_backward = p;p = p_forward;}l->next = p_backward;cout << "已翻轉成功" << endl; }int main() {// (1)隨機生成十個100~999的三位整數,并且存入鏈表中srand((unsigned(time)));LinkList l; // 鏈表l(英文字母l)l = new LNode; // 頭節點是鏈表的象征l->next = NULL; // 初始化鏈表cout << "(1)" << endl;for (int i = 1; i <= 10; i++){int random_int = rand() % 900 + 100;LNode* p = new LNode;p->data = random_int;Insert(l, p, i);}// (2)輸出鏈表的內容cout << "(2)" << endl;List_show(l);// (3)讀入一個整數,查看該整數是否在表中,若在,輸出其位置,若不在,則說明一下不在//加入了可多次輸入整數進行判斷的功能 cout << "(3)" << endl;Search_in_list(l);// (4) (1)中函數Insert()已經實現了該功能cout << "(4)" << endl;LNode* p1 = new LNode;int location;p1->data = 111; //默認插入的值為111cout << "你想在鏈表的哪個位置插入新的元素?\t位置: ";cin >> location;Insert(l, p1, location);List_show(l);//(5)讀入一個整數,若該整數在鏈表里,刪除該整數,輸出鏈表的內容;cout << "(5)" << endl;LNode* p2 = new LNode;p2->data = 111; //默認插入的值為111cout << "你想刪除哪個位置的結點?\t位置: ";Delete(l);List_show(l);// (6)cout << "(6)" << endl;Reverse(l);List_show(l); }

2、棧的鏈式存儲結構實現(返回目錄🖱)

#include <iostream> #include <ctime> #include <iomanip> using namespace std;typedef struct LNode {int length;int data;LNode* next; }LNode, * LinkStack;void InitStack(LinkStack &s) {s->next = NULL;s->length = 0;cout << "鏈棧初始化成功,長度為0......" << endl; } void Push(LinkStack& s, int data) {LNode* p = new LNode;p->data = data;p->next = s->next;s->next = p;s->length++;cout << "在位置" << setw(3) << s->length << "添加元素" << p->data << endl; }void Pop(LinkStack& s) {LNode* p = new LNode;p = s->next;s->next = p->next;s->length--;cout << "從棧中彈出元素 " << p->data <<setw(20)<<"深度為"<<s->length<< endl;delete p; }//輸出鏈棧的內容 void ShowListStack(LinkStack& s) {// 判斷鏈表是否為空if (!s->next){cout << "棧空......退出程序......"<<endl;exit(0);}else{LNode* p = new LNode;p = s->next;cout << "鏈棧為:" << endl;;for (int i = 1; p; i++){if (p->next)cout <<"| " << p->data << " |\n"<<endl;else cout << "| " << p->data << " |\n"<<"-------\t"<<"深度為:" << i << endl;p = p->next;}} }int main() {srand(unsigned(time));//初始化鏈棧LinkStack s;s = new LNode;InitStack(s);// 入棧cout << "(1)\n";for (int i = 0; i < 10; i++)Push(s, rand() % 900 + 100);ShowListStack(s);// 出棧cout << "(2)\n";for (int i = 0; i < 10; i++)Pop(s);ShowListStack(s); }

3、隊列的鏈式存儲結構的實現(返回目錄🖱)

#include <iostream> #include <ctime> #include <iomanip> using namespace std;//鏈隊結點結構體 typedef struct LQNode {int data;LQNode* next; }LQNode, * LQNodeptr; //鏈隊結構體 typedef struct LinkQueue {LQNodeptr head;LQNodeptr rear; }LinkQueue;//初始化 void InitLQ(LinkQueue &lq) {lq.head = lq.rear = new LQNode; //頭結點lq.head->next = lq.rear->next = NULL; }//入隊 void Insert(LinkQueue &lq, int data) {LQNode* p = new LQNode;p->data = data;p->next = NULL;lq.rear->next= p;lq.rear = p;cout << "在隊尾加入結點: " << data << endl; }//輸出鏈隊 void ShowLQ(LinkQueue &lq) {LQNode* p = new LQNode;p = lq.head->next;cout << "鏈隊:";int length = 0;while (p){++length;if (p != lq.rear)cout << p->data << "—";else cout << p->data << "\t長度為:"<<length<<endl;p = p->next;} }//翻轉 void Reverse(LinkQueue &lq) {LQNode* p = new LQNode; LQNode* q = new LQNode;LQNode* r = new LQNode;LQNode* p1 = new LQNode;p = lq.head; // 頭指針p1 = p->next; // 先保存原鏈隊的第一個結點,因為最后需要讓尾指針指向它q = p->next;lq.head->next = NULL;while (q){r = q->next;q->next = p;p = q;q = r;}lq.rear = p1;p1->next = NULL;lq.head->next = p; //將頭指針指向尾指針的前一個結點 } int main() {srand(unsigned(time));LinkQueue lq;InitLQ(lq);//初始化InitLQ(lq);for (int i = 0; i < 10; i++){Insert(lq, rand() % 900 + 100);}//輸出隊列ShowLQ(lq);//翻轉Reverse(lq);//輸出ShowLQ(lq); }

4、線性表、棧和隊列的應用實現:(返回目錄🖱)
(1) 用隨機函數生成10個3位整數(100~999),把這些整數存于單鏈表中,然后讀入一個整數,以該值為基準把單鏈表分割為兩部分,所有小于該值的結點排在大于或等于該值的結點之前。

#include <iostream> #include <ctime> #include <iomanip> using namespace std;// 鏈式結點(可用于表示鏈表) typedef struct LNode {int data;LNode* next; }LNode, * LinkList;//鏈棧(用于聲明鏈棧的頭結點,頭結點不含數據,故無data變量) typedef struct Stack {LNode* next;int depth; } *LinkStack;//往單鏈表中添加元素 void Insert_LinkList(LinkList& l, LNode* new_node, int n) {LNode* p = new LNode;p = l;for (int i = 1; i < n; i++){p = p->next;}new_node->next = p->next;p->next = new_node; }//輸出單鏈表 void Show_LinkList(LinkList& l) {// 判斷鏈表是否為空if (!(l->next)){cout << "出錯,此鏈表為空鏈表,退出程序......";exit(0);}else{LNode* p = new LNode;p = l->next;cout << "鏈表為:";for (int i = 1; p; i++){if (p->next)cout << p->data << "——";else cout << p->data << "\t長度為:" << i << endl;p = p->next;}} }//向棧中添加元素 void Push(LinkStack& s, int data) {LNode* p = new LNode;p->data = data;p->next = s->next;s->next = p;s->depth++;//cout << "在位置" << setw(3) << s->depth << "添加元素" << p->data << endl; }//在棧中彈出元素 int Pop(LinkStack& s) {LNode* p = new LNode;p = s->next;s->next = p->next;s->depth--;//cout << "從棧中彈出元素 " << p->data << setw(20) << "深度為" << s->depth << endl;return p->data; }//輸出鏈棧的內容 void ShowListStack(LinkStack& s) {// 判斷鏈表是否為空if (!s->next){cout << "棧空......退出程序......" << endl;exit(0);}else{LNode* p = new LNode;p = s->next;cout << "鏈棧為:" << endl;;for (int i = 1; p; i++){if (p->next)cout << "| " << p->data << " |\n" << endl;else cout << "| " << p->data << " |\n" << "-------\t" << "深度為:" << i << endl;p = p->next;}} }//以某值為基準把單鏈表分割為兩部分 void Devide(LinkList& l,int n) {// 初始化裝載大于n結點的棧 s_bigLinkStack s_big = new Stack;s_big->next = new LNode;s_big->next = NULL;s_big->depth = 0;// 初始化裝載小于n結點的棧 s_smallLinkStack s_small = new Stack;s_small->next = new LNode;s_small->next = NULL;s_small->depth = 0;LNode* p = new LNode;p = l->next;//如果鏈表長度為0或1,則無法分割if (p==NULL || p->next==NULL){cout << "鏈表長度為0或1,無法分割...." << endl;exit(0);}while (p){int temp = p->data;if (temp >= n){Push(s_big, temp);cout << "在元素 大 于"<<n<<"的棧的位置" << setw(3) << s_big->depth << "添加元素" << p->data << endl;p = p->next;}else{Push(s_small, temp);cout << "在元素 小 于" << n << "的棧的位置" << setw(3) << s_small->depth << "添加元素" << p->data << endl;p = p->next;}}ShowListStack(s_big);ShowListStack(s_small);LNode* p_ = new LNode;p_ = l->next;while (s_small->next){p_->data = Pop(s_small);cout << "從元素 小 于"<<n<<"的棧中彈出元素 " << p_->data << setw(20) << "此時 小 棧深度為" << s_small->depth << endl;p_ = p_->next;}while (s_big->next){p_->data = Pop(s_big);cout << "從元素 大 于" << n << "的棧中彈出元素 " << p_->data << setw(20) << "此時 大 棧深度為" << s_big->depth << endl;p_ = p_->next;} } int main() {srand(unsigned(time));LinkList l = new LNode;l->next = NULL;for (int i = 0; i < 10; i++){LNode* p = new LNode;p->data = rand() % 900 + 100;Insert_LinkList(l, p, i + 1);}// 顯示原鏈表Show_LinkList(l);//小的放300前面,大的放300后面Devide(l, 300);Show_LinkList(l); cout <<"分割已完成。。。";

(2) 假設一個字符串中可以包含三種括號:( )[ ]{},且這三種括號可以按任意次序嵌套使用(如:“…[…{…}…[…]…]…(…)” 為合法嵌套,“…[…{… )…[…]…]…(…)”為不合法嵌套)。編寫判別給定表達式中所含括號是否正確配對出現的算法,如果是合法嵌套則返回為true,如果是不符合法嵌套則返回為false。

#include<iostream> using namespace std;typedef struct SNode {char ch;int depth;SNode* next; }SNode, *Stack;void InitStack(Stack& s) {s = new SNode;s->next = NULL;s->ch = NULL;s->depth = 0; }bool StackEmpty(Stack s) {if (s->next == NULL){return true;cout << "棧空..." << endl;}else return false; }void Push(Stack& s, char ch) {SNode* p = new SNode;p->next = NULL;p->ch = ch;p->next = s->next;s->next = p;s->depth++;cout << "在棧中放入字符 \"" << ch << "\" \t棧深度為:" << s->depth << endl; }void Pop(Stack& s) {SNode* p = new SNode;p = s->next;cout << "彈出元素" << p->ch << endl;s->next = p->next;delete p; }char GetTop(Stack s) {return s->next->ch; }bool Matching() {Stack s;InitStack(s);cout << "請鍵入字符...按#退出\t";char ch;int flag = 1;cin >> ch;while (ch!='#'&& flag){switch (ch){case'(':case'[':case'{':{Push(s, ch);cout << "請繼續鍵入字符...按#退出\t";}; break;case')':if (!StackEmpty(s) && GetTop(s) == '(')Pop(s);else{flag = 0;cout << "括號" << ch << "不匹配";}; break;case']':if (!StackEmpty(s) && GetTop(s) == '[')Pop(s);else{flag = 0;cout << "括號" << ch << "不匹配";}; break;case'}':if (!StackEmpty(s) && GetTop(s) == '{')Pop(s);else{flag = 0;cout << "括號" << ch << "不匹配";}; break;}cin >> ch;}if (StackEmpty(s) && flag) return 1;else return 0; }int main() {if (Matching()) cout << "匹配成功";else cout << "匹配失敗"; }}

(3)用隊列求解迷宮問題的最短路徑
代碼雛形出來了,但是調試了四個小時還是沒解決那個關鍵bug……

總結

以上是生活随笔為你收集整理的实验一 线性表、堆栈和队列的操作与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲第3页| 女同久久另类69精品国产 | av综合在线观看 | h片在线看| 在线免费一级片 | 影音先锋男人天堂 | 久热久操 | 日本天堂在线观看 | 激情吧 | 日韩精品在线观看一区二区 | 午夜一级黄色片 | 成人在线观看一区二区 | 青青草在线播放 | 欧美人妻精品一区二区三区 | 欧美性受xxxx黒人xyx性爽 | 看毛片网| 久久久999久久久 | xxx性日本| 玖草视频在线观看 | 亚洲国产成人精品无码区99 | 日本黄色a视频 | 天天操操操操 | 激情综合网五月 | 日本99视频| 伊人ab| 天天看天天干 | 亚洲国产一二三区 | 免费黄色在线视频 | 国产亚洲精品码 | 激情麻豆 | 日日干夜夜艹 | 亚洲乱码一区二区 | 婷婷亚洲精品 | 国产区精品在线 | 午夜精品一区二 | 亚洲蜜桃av | 欧洲xxxxx| 性感美女在线观看 | 91大片免费看| 自拍偷拍色图 | 国产黄色视 | 先锋影音在线 | 国产精品久久久久久久久久久久午夜片 | 国产ts变态重口人妖hd | 9色在线视频 | 猛男大粗猛爽h男人味 | 亚洲视频在线观看网址 | 九九视频在线免费观看 | 国产乱码在线 | 国产成人精品综合 | 精品无码人妻一区二区三 | 素人一区二区三区 | www.五月天婷婷 | 日韩高清av在线 | 伊人射 | 色花堂在线 | 久久精品欧美一区二区 | 欧美 日韩 国产 高清 | 国产一区在线不卡 | 男人视频网 | 超碰青娱乐 | 色婷婷精品久久二区二区密 | 日本高清网站 | 久久久网站 | 午夜福利一区二区三区 | 日韩色 | 欧美黄色大片在线观看 | 特级毛片av| 都市激情校园春色 | 91精品国自产 | 黄色在线免费 | 亚洲av电影一区 | 国产电影一区二区三区 | 亚洲视频大全 | 老司机午夜免费视频 | 欧美老女人性生活 | 啪啪av| 神马午夜精品 | 欧美色图30p | 亚洲经典一区二区三区四区 | 蜜臀麻豆| 日日夜夜天天干 | 日韩成人av电影 | 99久久精品无码一区二区毛片 | 午夜免费视频观看 | 韩国av在线| 色呦呦视频在线 | 欧美激情综合五月色丁香 | av免费片 | 边添小泬边狠狠躁视频 | 久久国产加勒比精品无码 | a级黄色片 | www.伊人.com| 日本一区二区三区视频在线观看 | 亚洲经典三级 | 欧美日韩高清在线播放 | 亚洲综合网站 | 波多野结衣潜藏淫欲 | 综合久久国产 |