繁体   English   中英

在C ++中使用队列和堆栈对2个向量进行加减运算

[英]Addition and substraction of 2 vectors using queue and stack in C++

我的C ++代码有问题。 我需要使用一些头文件逐个组件添加和减去2个数学向量,但是我还可以实现其他一些功能。 问题是我的程序没有任何错误,但没有执行...例如,如果我有向量A(3,5)和B(1,7),则结果应为:A + B =(4 ,12)和AB =(2,-2)。 这是我的主要.cpp文件:

#include <iostream>
#include "queque.h"
#include "stack_base.h"
using namespace std;

template<typename T>
class App {
    public:
        Stack<T> stack;
        T minEle;
        App(Stack<T> stack) {
            this->stack = stack;
        }
        T sum(){
            Stack<T> tempStack = stack;
            T sum=1;
            for(int i=0;i<stack.getTopLevel();i++){

            sum+=tempStack.peek();
            tempStack.pop();
        }
            return sum;
        }
        T substract(){
            Stack<T> tempStack = stack;
            T sum=1;
            for(int i=0;i<stack.getTopLevel();i++){

            sum-=tempStack.peek();
            tempStack.pop();
        }
            return sum;
        }
};

int main(){
  Stack<int> myStack;
    App<int> a(myStack);
    int values[7] = {5, 2, 3, 1, 4, 8, 6};
    int values1[7] = {5, 2, 3, 1, 4, 8, 6};
    for(int i=0;i<8;i++)
    myStack.push(values[i]);
    myStack.push(values1[i]);
    cout<<a.sum();
  return 0;
}

另外,在这里您可以找到queque.h文件: https ://pastebin.com/yg0CdCnd和stack_base: https ://pastebin.com/P6rzQJC1谢谢,任何帮助都将是有用的!

您需要在主函数中添加括号,否则它将无法运行。

int main()
{
  Stack<int> myStack;
  App<int> a(myStack);
  int values[7] = {5, 2, 3, 1, 4, 8, 6};
  int values1[7] = {5, 2, 3, 1, 4, 8, 6};
  for(int i=0;i<8;i++)
  myStack.push(values[i]);
  myStack.push(values1[i]);
  cout<<a.sum();
  return 0;
}

我没有检查您的代码是否正确,但这就是为什么它不会执行的原因。

您的sum()subtract()是有缺陷的。 您根本不应该引用getTopLevel 它在链接的头文件中定义为内部数组中堆栈顶部项目的索引。 这是Stack的实现细节,不应真正成为公共接口的一部分。

相反,我建议您按预期使用Stack -通过元素推入 Stack ,然后根据需要弹出顶部元素。

例如

    T sum()
    {
        Stack<T> tempStack = stack;
        T sum = 0;

        while (!tempStack.isEmpty())
        {
            sum += tempStack.pop();
        }

        return sum;
    }

它不起作用,因为在此处创建App对象时

App<int> a(myStack);

您正在通过复制myStack为对象a创建新的Stack。 将数据推送到变量myStack不会更改对象a内的Stack<T>变量。

为了获得预期的结果,您需要更改App类,使其具有指向Stack<T>数据成员的指针,例如:

Stack<T> * stack;

之后,更新您的构造函数以对应您的数据成员:

App(Stack<T> &stack) {
    this->stack = &stack;
}
T substract(){
    Stack<T> tempStack = *stack;
    T sum=1;
    for(int i=0; i<=stack->getTopLevel(); i++) {
        sum-=tempStack.peek();
        tempStack.pop();
    }
    return sum;
}
T sum(){
    Stack<T> tempStack = *stack;
    T sum=1;
    for(int i=0; i<=stack->getTopLevel(); i++) {
        sum+=tempStack.peek();
        tempStack.pop();
    }
    return sum;
}

那应该做。 另外,您stack_base.hqueque.h文件中定义NMAX 10 ,并在queque.h文件中定义NMAX 5 这限制了堆栈中元素的数量。 据您的代码暗示queque.h是不必要的。 删除#include "queque.h"行,并将正在定义NMAX的行更改为stack_base.h文件中的#define NMAX 20stack_base.h内容。 这样myStack可以包含20个元素。 最后,您的主要功能应如下所示:

int main(){
    Stack<int> myStack;
    App<int> a(myStack);
    int values[7] = {5, 2, 3, 1, 4, 8, 6};
    int values1[7] = {5, 2, 3, 1, 4, 8, 6};
    for(int i=0; i<8; i++) {
        myStack.push(values[i]);
        myStack.push(values1[i]);
    }
    cout<<a.sum()<<endl;
    return 0;
}

由于将sum变量初始化为1,因此应该显示59,它比元素的sum多1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM