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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

双栈的基本操作

發布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双栈的基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

雙棧的基本操作

描述

將編號為0和1的兩個棧存放于一個數組空間V[m]中,棧底分別處于數組的兩端。當第0號棧的棧頂指針top[0]等于-1時該棧為空;當第1號棧的棧頂指針top[1]等于m時,該棧為空。兩個棧均從兩端向中間增長(見下圖)。試編寫雙棧初始化,判斷棧空、棧滿、進棧和出棧算法的函數。函數調用次序依次為:進棧、棧滿的判斷、出棧、棧空的判斷。

雙棧數據結構的定義如下:

typedef struct

{

int top[2], bot[2]; //棧頂和棧底指針

SElemType *V; //棧數組

int m; //棧最大可容納元素個數

}DblStack;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UCMb1wZQ-1636560782609)(http://acm.bjfu.edu.cn/acmhome/upload/image/20161104175533032.png)]

雙棧結構的表示

輸入

多組數據,每組數據有四行,每行的數據之間均用空格分隔。第一行為一個整數m,表示數組V的大小,第二行為四個整數e0、e1、d0、d1,e0和e1分別代表壓入0號棧和1號棧的整數序列E0和E1的長度(依次連續入棧,中間沒有出棧的情況),d0和d1分別代表從0號棧和1號棧彈出的序列的長度(依次連續出棧,中間沒有入棧的情況)。第三行和第四行分別表示序列E0和E1。當m=0時,輸入結束。

輸出

多組數據,每組數據有四行,每行的數據之間均用空格分隔。第一行為一個整數m,表示數組V的大小,第二行為四個整數e0、e1、d0、d1,e0和e1分別代表壓入0號棧和1號棧的整數序列E0和E1的長度(依次連續入棧,中間沒有出棧的情況),d0和d1分別代表從0號棧和1號棧彈出的序列的長度(依次連續出棧,中間沒有入棧的情況)。第三行和第四行分別表示序列E0和E1。當m=0時,輸入結束。

輸入樣例 1
7 3 4 2 2 1 2 3 2 3 4 5 12 4 6 4 3 1 3 4 5 1 3 5 6 8 1 0
輸出樣例 1
1 3 2 1 5 4 1 0 5 4 3 1 0 1 8 6 1
AC 代碼
// #include <iostream>// #define MAX 100// using namespace std;// typedef struct // { // int *top[2]; // int *base[2]; // int maxSize; // }dStack;// void initStack (dStack &s, int n) // { // s.base[0] = new int [MAX]; // s.base[1] = s.base[0] + n - 1; // s.top[0] = s.base[0]; // s.top[1] = s.base[0];// s.maxSize = n; // }// bool is_full(int *top0, int *top1) // { // if (top0 > top1) // return true; // else // return false; // }// bool is_empty0(int *top0, int *base0) // { // if (top0 == base0) // return true; // else // return false; // }// bool is_empty1(int *top1, int *base1) // { // if (top1 == base1) // return true; // else // return false; // }// void push0(dStack &s, int e) // { // *(s.top[0] ++) = e; // }// void push1(dStack &s, int e) // { // *(s.top[1] --) = e; // }// void pop0(dStack &s) // { // s.top[0] --; // cout << *(s.top[0]) << " "; // }// void pop1(dStack &s) // { // s.top[1] ++; // cout << *(s.top[1]) << " "; // }// int main() // { // int n; // int e0, e1, d0, d1; // while (cin >> n, n) // { // int cnt = 0; // dStack s; // initStack (s, n);// cin >> e0 >> e1 >> d0 >> d1; // while (e0 --) // { // int e; // cin >> e; // push0(s, e); // cnt ++; // } // while (e1 --) // { // int e; // cin >> e; // push1(s, e); // cnt ++; // }// // cout << is_full(s.top[0], s.top[1]) << endl;// 用兩個的top指針進行判斷 // if (cnt >= n) // cout << 1 << endl; // else // cout << 0 << endl; // while (d0 --) // pop0(s); // 刪除和插入同理,都是直接傳入整個棧 // cout << !is_empty0(s.top[0], s.base[0]) << endl; // 判空只需要傳入一邊的指針即可 // while (d1 --) // pop1(s); // cout << !is_empty1(s.top[1], s.base[1]) << endl; // }// return 0; // }// 不知道為啥,上述代碼總是WA,下次有時間再看看#include <iostream>#define MAX 100using namespace std;typedef struct LNode {int *top[2];int *base[2];int maxSize; }DblStack;void initStack(DblStack &s, int n) {s.base[0] = new int [MAX];s.base[1] = s.base[0] + n - 1; // 由于第二個棧的base是在最右端s.top[0] = s.base[0];s.top[1] = s.base[1];s.maxSize = MAX; }bool isEmpty0(int *base, int *top) // 傳入第一個棧的兩個指針 {if (base == top)return true;else return false; }bool isEmpty1(int *base, int *top) // 傳入第二個棧的兩個指針 {if (base == top)return true;else return false; }bool isFull(int *top0, int *top1) {if (top0 > top1)return true;else return false; }void push0(DblStack &s, int e) {*(s.top[0] ++) = e; // 由于入棧操作中,top指針總是指向數據的下一位,因此這里需要減回來 }void push1(DblStack &s, int e) {*(s.top[1] --) = e; }void pop0(DblStack &s) {s.top[0] --;cout << *(s.top[0]) << " "; }void pop1(DblStack &s) {s.top[1] ++;cout << *(s.top[1]) << " "; }int main() {int n;while (cin >> n, n){DblStack s;initStack(s, n);int e0, e1, d0, d1;cin >> e0 >> e1 >> d0 >> d1;while (e0 --){int e;cin >> e;push0(s, e);}while (e1 --){int e;cin >> e;push1(s, e);}cout << isFull(s.top[0], s.top[1]) << endl;while (d0 --)pop0(s);cout << !isEmpty0(s.base[0], s.top[0]) << endl;while (d1 --)pop1(s);cout << !isEmpty1(s.base[1], s.top[1]) << endl;}return 0; }

總結

以上是生活随笔為你收集整理的双栈的基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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