我是C 的新手,我對堆疊的理解不是很深。我試著按照一些教程使用遞回對Stack1進行排序,但是沒有任何效果,或者說它只關注于包含整數的陣列。我也試過直接對Names陣列進行排序,但沒有效果。我如何為我的Names陣列以非復雜的方式進行排序(因為我是新手,對其理解不深)?
以下是我的代碼:
//Necessary libraries。
#include <iomanip>
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
//Main CPP Function[/span
int main() {
//Name and Surname
std:: string Names[] = { "Sam"/span>, "John"/span>, "Simon"/span>, "Sarah"/span>, "Mat"/span>, "Nick"/span>, "Isaac"/span>, "Anna"/span>, "Daniel"/span>, "Aaron", "Jack", "Kathrine" }; std: :sort(std::begin(Names), std::end(Names) )。)
std:: string Surnames[] = { "Williams"/span>, "Phoenix"/span>, "Johnson"/span>, "Khosa", "Jackon", "Robts", "韋恩", "三島", "羅斯"。"Black", "Mohamed", "Bruckner" };
//Score陣列
int Score[] = { 60, 85, 75, 81, 38, 26, 74, 34, 64, 83, 27, 42 };
//Variable decleration for if statements 需要的變數解碼。
int l;
int k;
//Calculates array sizesizeof(Names) / sizeof(Names[0])。
k = sizeof(Surnames) / sizeof(Surnames[0])。
//------------------------------- Stack One --------------------------------------//。
//var宣告
stack <string> Stack1;
stack <int> Score1;
cout << "Stack One" << endl;
//sort stack one alphabetically by name[/span]。
//當我們的Names陣列不是空的時候,我們將把它推入堆疊。
for (int i = 0; i < l; i ) {
//push Names, Surnames and Scores to first stack[/span]。
Stack1.push( Names[i])。
Stack1.push(Surnames[i])。
Score1.push(Score[i])。
//prints Names, Surnames and Scores for the first stack。
while (!Stack1.empty()){
cout << " " << setw(20) < < Stack1. top() << " " << Score1.top() < < endl;
//停止無盡回圈的列印。
Stack1.pop()。
Score1.pop()。
}
}
return 0;
}
正如評論中所提到的,有一項任務要求我對我的堆疊進行分類。以下是作業文本,供您進一步了解。

uj5u.com熱心網友回復:
如果堆疊的底層容器將其資料存盤在連續的記憶體中,對于std::vector或std::deque來說,排序是非常簡單的。
你可以簡單地對底層容器進行排序。這真是太簡單了。
std::deque是默認的底層容器。所以,這種方法在大多數情況下是可行的。
請看下面的小例子:
我的猜測是,你想要一些遞回的解決方案,因為你提到了類似的問題。
如果有一個可排序的或已經排序的輔助容器,也可以有一個遞回的解決方案。
#include <iostream>
#include <stack>
#include <deque>
#include <algorithm>
#include <functional>
#include <set>
//使用輔助容器的遞回排序函式
void sortStackRecursive(std: :stack<int>& myStack, std::multiset<int> data) {
//檢查遞回的結束。
if (myStack.empty()) {
//所有的元素都已經從堆疊中彈出,排序并放入多集。
//現在按照排序的順序再次將它們推到堆疊中。
for (const int value : data) myStack.push(value)。
return;
}
else {
//將堆疊頂部的元素添加到多組中。
data.insert(myStack.top()) 。
myStack.pop()。
//自我呼叫
sortStackRecursive(myStack,data)。
}
}
void sortStack(std::stack<int>& myStack) {
std::multiset<int> data{};
sortStackRecursive(myStack,data)。
}
int main() {
//定義一個堆疊,并用一些值對其進行初始化。
std::stack<int> myStack(std:: deque<int> {2,1,4,3, 10,20,32,25}) 。
/span>排序
sortStack(myStack)。
//輸出堆疊內容
for (; not myStack.empty(); myStack. pop()) std::cout << myStack.top() < < '
'。
return 0;
但是,根據我最后的猜測,導師真正想要的是你只使用堆疊,而不使用任何輔助容器。
這也可以通過使用一個臨時堆疊來實作。請看:
#include <iostream>
#include <stack>
#include <deque>
#include <algorithm>
//在一個臨時堆疊的幫助下,對一個堆疊進行排序。
void sortStack(std::stack<int> & myStack){
//定義一個臨時堆疊
std::stack<int> tempStack。
//只要原始堆疊上有值就可以了
while (not myStack.empty() ) {
//獲得堆疊頂部的值并記住它。
int value = myStack.top() 。
myStack.pop()。
// And now. 只要我們的臨時堆疊上有值就可以了
///并且臨時堆疊的頂層值小于的值
//原堆疊上的值。
while(not tempStack.empty() and tempStack.top() < value) {
//然后交換當前的頂部元素。
myStack.push(tempStack.top()。
tempStack.pop()。
}
//把原來更大的值放回堆疊頂。
tempStack.push(value)。
}
//如果在臨時堆疊上還有更大的值
while (not tempStack.empty() ) {
//the push them back on the original stack(推回原堆疊)。
myStack.push(tempStack.top()。
tempStack.pop()。
}
}
int main() {
//定義一個堆疊,并用一些值對其進行初始化。
std::stack<int> myStack(std:: deque<int> {2,1,4,3, 10,20,32,25}) 。
/span>排序
sortStack(myStack)。
//輸出堆疊內容
for (; not myStack.empty(); myStack. pop()) std::cout << myStack.top() < < '
'。
return 0;
uj5u.com熱心網友回復:
為了有效地對一個堆疊進行排序,我們需要在堆疊的隨機位置進行偷看,最好是將堆疊的底部與堆疊中最大的元素進行交換。
但是這已經違反了堆疊的理念,因此我們需要更多的東西,例如再多2個或3個堆疊。
我們可以從一個未排序的堆疊和兩個空堆疊開始,每次從未排序的堆疊中移除一個專案,并比較該元素是否比臨時堆疊A的頂部元素小或大。 如果它大,就把它放在堆疊A上,否則就把它放在堆疊B上。最后,最大的元素在堆疊A的頂部,而原來的隨機元素堆疊是空的。我們現在可以將堆疊A中最頂端的元素移動到原始堆疊的頂部,這樣就開始按降序收集所有的元素。
然后將堆疊A和B中的所有元素移到原始堆疊中,并按照上一步進行操作,除了最后一個元素,它被排序了。
如果我們不允許知道堆疊的大小(即迭代次數),那么我們需要四個堆疊:未排序的、到目前為止最大的、未到目前為止最大的和已排序的。
這種演算法將模擬冒泡排序,然而,由于我們知道臨時堆疊A是部分排序的,我們或許可以利用這一事實來實作例如合并排序。
uj5u.com熱心網友回復:
首先,使用堆疊進行重新排序是非常不切實際的,但它可能是你在學校/大學得到的那些作業之一,可以提高你解決問題的能力。
無論如何,如果你被迫使用堆疊,你首先應該創建1-2個臨時堆疊,這在你的代碼中是缺少的。
我可以給你降序的基本邏輯,你可以進一步將其用于你的其他情況。
要遵循的步驟:
- 首先,你創建2個臨時堆疊和一個主堆疊。所以我們的臨時堆疊將被稱為"tempStack1"和"tempStack2",而我們的主堆疊將被稱為"mainStack"。
- 將所有的初始輸入推入mainStack。現在,彈出并移動mainStack的頂部元素到tempStack1。
- 現在檢查Stack的頂部元素是否大于tempStack1的頂部元素。如果它是大的,那么從Stack中彈出該元素并將其推送到tempStack1。如果它是小的,那么就把mainStack的頂部元素推到tempStack2。
- 如果tempStack2中存在一個元素,我們將把它與tempStack1的頂層值進行比較。如果tempStack2的頂值小于tempStack1的頂值,那么我們只需將tempStack1的頂值推到mainStack。然而,如果tempStack2的頂值大于tempStack1的頂值,或者如果tempStack1是空的,我們將把tempStack2的頂值推到tempStack1。
- 我們不斷重復這些步驟,最終我們會將堆疊以升序放入tempStack1中。現在我們要做的就是把tempStack1中的每個元素彈出并推送到mainStack中,這樣它就會倒過來,我們就有了降序的順序。
你可以將類似的邏輯應用于你的其他案例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/310786.html
標籤:
