C++ 先进先出列表(移动元素)[C+;+;]
大家晚上好 我正试图解决一个相当简单的问题,但是。。嗯,看来我不行 其思想是,我有一个包含n个元素的FIFO列表(FIFO队列),它的值为k(kC++ 先进先出列表(移动元素)[C+;+;],c++,data-structures,list,queue,fifo,C++,Data Structures,List,Queue,Fifo,大家晚上好 我正试图解决一个相当简单的问题,但是。。嗯,看来我不行 其思想是,我有一个包含n个元素的FIFO列表(FIFO队列),它的值为k(kd.size()) 返回; 对于(int i=0;i如果您的意思是“将第k个元素移动到队列的前面”,那么这是一种方法: void move( int *a, unsigned n, unsigned k ) { int t; // To store the temporary for the k'th element t = a[
#include <iostream>
using namespace std;
void move (int a[100], unsigned n, unsigned k) {
int t[100];
unsigned i;
for (i=0; i<=n-1; i++) t[i]=a[i];
for (i=0; i<=k-1; i++) a[i]=a[i+k-1];
for (i=k; i<=n-1; i++) a[i]=t[i+1];
}
int main () {
int a[100];
unsigned k, n, i;
cout<<"n; k= "; cin>>n>>k;
for (i=0; i<=n-1; i++) cin>>a[i];
move (a, n, k);
for (i=0; i<=n-1; i++) cout<<a[i]<<" ";
}
#包括
使用名称空间std;
无效移动(整数a[100],无符号n,无符号k){
int t[100];
未签名的i;
对于(i=0;ia[i];
移动(a,n,k);
对于(i=0;i看起来您想要左旋转?这应该不是很难。只需将第一个k
元素排出来,将剩余的n-k
元素向左移动(可能将它们放在临时数组的开头),然后按顺序在末尾添加第一个k
以这种方式修改代码可能如下所示:
void move (int a[100], unsigned n, unsigned k) {
int t[100];
unsigned i;
for (i=k; i<=n-1; i++) t[i-k]=a[i];
for (int x=0; x<=k-1; x++) t[i++-k]=a[x];
}
void移动(int a[100],无符号n,无符号k){
int t[100];
未签名的i;
对于(i= k;i),既然你已经把它标记为C++,我会假定这就是你所使用的。在这种情况下,你几乎应该肯定是使用了<代码> STD::DeQue/Cuffor,而不是一个用于存储数据的数组。此外,队列通常有一个“前”和“后”,所以“左”并不太重要。
假设(为了论证起见)您想要的是从队列的后面获取k个元素并将它们移动到前面,您可以执行以下操作:
typedef std::deque<your_type> data;
void push_to_front(data &d, int k) {
if (k > d.size())
return;
for (int i=0; i<k; i++) {
data::value_type v = d.pop_back();
d.erase(d.back());
d.push_front(v);
}
}
typedef std::deque数据;
无效推送至前端(数据与数据,int k){
如果(k>d.size())
返回;
对于(int i=0;i如果您的意思是“将第k个元素移动到队列的前面”,那么这是一种方法:
void move( int *a, unsigned n, unsigned k )
{
int t; // To store the temporary for the k'th element
t = a[ k ];
// Shift all the elements to the right by one.
for( unsigned i = k; i > 0; --i )
a[ i ] = a[ i - 1 ];
// Put the k'th element at the left of the queue.
a[ 0 ] = t;
}
我不确定我是否完全理解了你的问题。但是看起来你实际上想要旋转数组的内容
将数组内容向左旋转k次。可以执行以下操作:
- 反转前K个元素
- 反转其余的N-K元素
- 反转整个阵列
例如:
N=5,K=3,数组=[12345]
- 步骤1:颠倒前3个元素:
[3 2 1 4 5]
- 第二步:倒转剩下的两个
要素:[3 2 1 5 4]
- 步骤3:反转整个阵列:[4
5 1 2 3]
C++函数执行相同的操作:
void move (int a[100], int n, int k) {
int t[100];
int i,j;
for (i=k-1,j=0; i>=0; i--,j++) t[j]=a[i];
for (i=n-1; i>=k; i--,j++) t[j]=a[i];
for (i=n-1,j=0; i>=0; i--,j++) a[j]=t[i];
}
在恒定空间中执行此操作的更好方法是就地执行反转:
void arr_rev(int a[100], int start, int end) {
int temp;
for(;start<end;start++,end--) {
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
void move2 (int a[100], int n, int k) {
arr_rev(a,0,k-1);
arr_rev(a,k,n-1);
arr_rev(a,0,n-1);
}
void arr_rev(整数a[100],整数开始,整数结束){
内部温度;
对于(;start这个问题很老了,但现在似乎最简单的解决方案是依靠。复杂性是线性的,但取决于第一个元素和最后一个元素之间的距离。因此,如果需要旋转1个元素,复杂性是O(1),对于3个元素,复杂性是O(3).什么是“用k个元素向左移动元素”意思?你是说“将第k个元素移动到队列的前面?”伙计,这真是一段难看的源代码,即使在codaddict清理了一点之后。-1不是我写的,但如果是因为代码,我也不会感到惊讶。我对未来的建议,因为你看起来要学会:为你的读者编写和格式化你的代码,而不是在打字时为你的方便。这将提高你的代码质量,并且会使某人更有可能回答你的问题。现在请原谅,我想我要上楼去开源的家伙,告诉他C++有多丑,如果他还在这座大楼里的话。我很抱歉……请原谅我的晦涩代码。我认为他不是那个意思。在他的例子中,k是3。谢谢你的回答。我真的是一个初学者(很难不注意),而且,我从来没有听说过std::deque。但我会调查一下。谢谢。:)谢谢你,丹本!这种方法正是我试图做的。至于STL数据结构,我还没有学会。:)再次感谢你。
void move (int a[100], int n, int k) {
int t[100];
int i,j;
for (i=k-1,j=0; i>=0; i--,j++) t[j]=a[i];
for (i=n-1; i>=k; i--,j++) t[j]=a[i];
for (i=n-1,j=0; i>=0; i--,j++) a[j]=t[i];
}
void arr_rev(int a[100], int start, int end) {
int temp;
for(;start<end;start++,end--) {
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
}
void move2 (int a[100], int n, int k) {
arr_rev(a,0,k-1);
arr_rev(a,k,n-1);
arr_rev(a,0,n-1);
}