gpt4 book ai didi

c++ - 在编码程序中使用自己的堆栈类 - 确定大小和顶部

转载 作者:行者123 更新时间:2023-11-28 07:00:11 25 4
gpt4 key购买 nike

我使用 C++ 堆栈库编写了一个编码程序。现在我正在尝试实现自己的堆栈类,但是我注意到堆栈库中有 size() 和 top() 成员函数。我不确定如何在没有这些函数的情况下实现我的代码,或者如何在我的类中编写这些函数以使它们与我已有的代码一起正常工作。

这是在我的 readFileEncode(string filename, stack<char> &text, string cypher) 中调用堆栈库函数的区域功能:

ifstream file(fileName, ios::in | ios::binary);
stack<char> temp;
char ch;

while (file.get(ch)){
temp.push(ch ^ cypher[temp.size() % cypher.length()]);
}

while (!temp.isEmpty()){
text.push(temp.top());
temp.pop();
}

这是我的堆栈类:

#include<iostream>

#define TRUE 1
#define FALSE 0

template <class TYPE>

class stack{
struct node{
TYPE element;
node *next;
};

public:
node *top;
int stackSize;

stack(void); //constructor
~stack(void); //destructor free the stack

void push(TYPE & value);
TYPE pop(void);
TYPE peek(void);
int isEmpty(void); //returns TRUE if empty
void print(void);
void reset(void); //pop all the elements off the stack
size_t size(void) const;
TYPE topOf(void) const;
};

template <class TYPE>
stack<TYPE>::stack(void){
top = NULL;
stackSize = 0;
}

template <class TYPE>
stack<TYPE>::~stack(void){
cout << "Entering Stack Destructor" << endl;
reset();
cout << "Exiting Stack Destructor" << endl;
}

template <class TYPE>
void stack<TYPE>::push(TYPE & value){
node *temp = new node;

if (temp == NULL){
cout << "Push: Memory Allocation Error" << endl;
exit(1);
}

temp->element = value;
temp->next = top;
top = temp;
stackSize++;
}

template <class TYPE>
TYPE stack<TYPE>::pop(void){
TYPE returnElement;

if (top != NULL){
node *temp = top;
returnElement = top->element;
top = top->next;
delete temp; //delete the node
stackSize--;
}

return(returnElement);
}

template <class TYPE>
TYPE stack<TYPE>::peek(void){
TYPE returnElement;
if (top != NULL)
returnElement = top->element;
cout << "Peek: " << returnElement << endl;
return(returnElement);
}

template <class TYPE>
int stack<TYPE>::isEmpty(void){
if (stackSize == 0)
return(TRUE);
else
return(FALSE);
}

template <class TYPE>
void stack<TYPE>::reset(void){
cout << "Reset Stack" << endl;
while (isEmpty() != TRUE){
pop();
}
}

template <class TYPE>
void stack<TYPE>::print(void){
cout << "Inside Print Stack" << endl;
cout << "Stack size = " << stackSize << endl;

node * temp = top;
while (temp != NULL){
cout << " " << temp->element << endl;
temp = temp->next;
}
}

template <class TYPE>
size_t size(void) const{
return stackSize;
}

template <class TYPE>
TYPE stack<TYPE>::topOf(void) const{
return (*top).element;
}

这个堆栈类是基于我对堆栈的了解。如果说有什么不妥,那是因为我是第一次写栈类。

所以基本上,我遇到了问题 1) 编写 size()top()函数,或 2) 重写我的 readFileEncode() 中的 while 循环功能来使用我所拥有的。我曾帮助正确编写代码以使用堆栈库,但现在尝试实现我自己的类却给我带来了问题。任何帮助将不胜感激。

编辑 1:在 dyp 的帮助下,我更改了 int size 的变量名至 int stackSize它出现在类里面的任何地方。另外,我更改了函数 top()topOf()

编辑 2:已更改 void push(TYPE &value)void push(TYPE const& value)在所有情况下。上面更新了代码。我使用了以下 main()测试类:

#include <iostream>
#include <cstdlib>
#include "stack.h"

using namespace std;

int main()
{
stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);

cout << "size: " << s.size() << endl;
cout << "top element: " << s.topOf() << endl;

s.pop();
s.pop();

cout << "size: " << s.size() << endl;
cout << "top element: " << s.topOf() << endl;
cout << "empty: " << s.isEmpty() << endl;

s.pop();
s.pop();
s.pop();

cout << "size: " << s.size() << endl;
//cout << "top element: " << s.top() << endl;
cout << "empty: " << s.isEmpty() << endl;

system ("pause");
}

一切正常,但是当我将 stack.h 文件附加到我的编码程序时,出现以下错误:

file.put(text.top());我得到“term does not evaluate to a function taking 0 arguments”,并在 text.push(temp.top()); 处出现相同的错误.我收到错误,但不确定如何修复它。

我也不得不搬家public:在我上面的课上node *top; int stackSize;因为我得到关于他们是私有(private)的错误。这不是我的测试程序的问题。也不确定是否可以。

最佳答案

我使用以下代码来测试我的堆栈:

 int main()
{
stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);

cout << "size: " << s.size() << endl;
cout << "top element: " << s.topOf() << endl;

s.pop();
s.pop();

cout << "size: " << s.size() << endl;
cout << "top element: " << s.topOf() << endl;
cout << "empty: " << s.isEmpty() << endl;

s.pop();
s.pop();
s.pop();

cout << "size: " << s.size() << endl;
//cout << "top element: " << s.top() << endl;
cout << "empty: " << s.isEmpty() << endl;

system ("pause");
}

我将以下堆栈类中的代码更改为以下代码,它似乎有效:

void push(TYPE const& value);
size_t size(void) const;
TYPE topOf(void) const;

和:

void stack<TYPE>::push(TYPE const& value){
node *temp = new node;

if (temp == NULL){
cout << "Push: Memory Allocation Error" << endl;
exit(1);
}

temp->element = value;
temp->next = top;
top = temp;
stackSize++;
}

template <class TYPE>
size_t stack<TYPE>::size(void) const{
return stackSize;
}

template <class TYPE>
TYPE stack<TYPE>::topOf(void) const{
return (*top).element;
}

还将我的 main 中出现的所有 top() 更改为 topOf()。不确定这是否正确,但它有效,我会听取 dyp 的建议并在 CodeReview 上交。 .

关于c++ - 在编码程序中使用自己的堆栈类 - 确定大小和顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22595481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com