- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 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/
出于好奇 - 我知道有 LAMP - Linux、Apache、MySQL 和 PHP。但是还有哪些其他 Web 堆栈替代方案的缩写呢?像 LAMR - Linux、Apache、MySQL Ruby
我有以下代码。 var stackMapIn = []; var stackMapOut = []; var stackBack = []; stackMapOut.push("m1"); $scop
我遇到了导致我的堆栈无法恢复的情况,我别无选择,只能将其删除。使用完全相同的模板,我继续创建了另一个同名的堆栈。 The following resource(s) failed to create:
这是我第一次查看 Node 堆栈,自从我学习使用 Ruby on Rails 进行 Web 开发以来,我对一些基本的东西有点困惑。我了解 Rails 目录是什么样的。 demo/ ..../app .
本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题。分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: ?
我正在按照指南 here ,它告诉我: The stack setup will download the compiler if necessary in an isolatedlocation (
同时 trying to debug a different question ,我安装了一个似乎与我安装的其他一些软件包冲突的软件包。 我跑了 $ stack install regex-pcre-
我花了几个小时创建了一个方法,该方法将从堆栈 s1 中获取 null 元素,并将它们放入 s2 中。然后该类应该打印堆栈。方法如下 import net.datastructures.ArraySta
我有一个类Floor,它有一个Stack block ,但我不知道如何初始化它。我曾尝试过这样的: public class Floor { private Stack stack;
我知道这个问题已经问过很多次了,但搜索一个小时后我仍然遇到问题。 我想使用一个 lifo 堆栈,它可以存储最大数量的元素。达到最大数量后,首先删除该元素并将其替换为新元素,这样在第一次弹出时我可以获取
我需要编写一个方法,压缩以执行以下操作; 目标compress方法是从栈s1中移除所有null元素。剩余(非空)元素应按其初始顺序保留在 s1 上。辅助堆栈 s2 应用作s1 中元素的临时存储。在该方
我正在尝试验证以下代码发生的顺序。 function square(n) { return n * n; } setTimeout(function(){ console.log("H
我需要一个字符数组,其中包含基于特定文件夹中文件数量的动态数量的字符数组。我能够通过初始化 char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH
我正在编写一些日志逻辑并想要进行一些缩进。了解是否存在任何函数调用或某个函数是否已完成的最简单方法是查看堆栈/帧的当前地址。让我们假设堆栈颠倒增长。然后,如果 log() 调用中的堆栈地址小于前一次调
所以内存分段在x86-64中被放弃了,但是当我们使用汇编时,我们可以在代码中指定.code和.data段/段,并且还有堆栈指针寄存器。 还有堆栈段、数据段和代码段寄存器。 代码/数据/堆栈的划分是如何
void main() { int x = 5; // stack-allocated Console.WriteLine(x); } 我知道 x 是堆栈分配的。但是关于 x 的堆栈中
这是我关于 SO 的第一个问题。这可能是一个愚蠢的问题,但到目前为止我还没弄明白。 考虑下面的程序 Reader.java: public class Reader { public
java中有没有一种快速的方法来获取嵌套/递归级别? 我正在编写一个函数来创建组及其成员的列表。成员也可以是团体。我们最终可能会得到一组循环的组/成员。 我想在某个任意级别停止。 我知道我可以将变量保
考虑以下代码: struct A{...}; A a[100]; A* pa = new A[100]; delete[] pa; a/pa 元素的销毁顺序是由标准定义的还是实现定义的(对于第二种情况
我在下面有一些代码。此代码是一个基本的压入/弹出堆栈类,我将其创建为模板以允许某人压入/弹出堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。 所以我希望能够创建一个基本上可以发送三个整
我是一名优秀的程序员,十分优秀!