C++ 先进先出列表(移动元素)[C+;+;]

C++ 先进先出列表(移动元素)[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[

大家晚上好

我正试图解决一个相当简单的问题,但是。。嗯,看来我不行

其思想是,我有一个包含n个元素的FIFO列表(FIFO队列),它的值为k(k 但是,我离那还远着呢

这是我到目前为止写的:

#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);
}