我可以用JS或PHP做到这一点:
while(var input = inputs.pop()) {
// do some bad things with input
}
Run Code Online (Sandbox Code Playgroud)
我在C#上尝试相同并且失败了:
Stack<double[]> localInputs = new Stack<double[]>();
for (int i = 0; i < inputs.Length; i++)
{
localInputs.Push(inputs[i]);
}
while (input = localInputs.Pop()) // this cause error about converting double to bool
{
// do some bad things on c#
}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?为什么我不能这样做?Assign应该返回boolean,nope?
基本上,如果我有类A,A类持有类的实例B,而无需使用new,我创建一个类的实例A使用new.类中B的类实例是否A存储在堆栈或堆中?
我有以下代码:
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
vector<int > vi;
for(int i=0; i<10; i++) {
int j=i*i;
vi.push_back(j);
}
for(int i=0; i<(int)vi.size(); i++)
cout<<vi[i]<<" ";
cout<<endl;
return 1;
Run Code Online (Sandbox Code Playgroud)
}
执行此代码将返回"0 1 4 9 16 25 36 49 64 81",但这对我来说并不直观.
据我所知,当变量在堆栈上分配时,变量在超出范围时被解除分配.我也知道C++ STL向量存储指向变量的指针.为什么尽管整数在堆栈上被分配并超出范围,但向量仍保持有效整数?由于整数被解除分配,矢量保持的指针不应该被取消吗?
所以这是我的问题,我一直试图在过去的5个小时内解决这个问题,我有一个头文件,一个测试文件和一个交流源文件.我真的很想了解发生了什么,以及为什么我可以在将来避免这个问题.头文件声明了struct但没有定义它:
typedef struct Stack *StackP;
在我的源文件Stack.c中我定义了堆栈:
struct Stack
{
int top;
int capacity;
int count;
ItemT items;
};
Run Code Online (Sandbox Code Playgroud)
在哪里ItemT定义为char *
在测试文件中,调用是:
StackP stackPtr = newStack();
以及我对c源文件中的newStack函数所拥有的是:
StackP newStack(void) {
struct Stack stack1;
StackP stackPtr = &stack1;
(stackPtr->items) = (ItemT)malloc(DEFAULT_CAPACITY*sizeof(ItemT));
(stackPtr->top) = -1;
(stackPtr->capacity) = DEFAULT_CAPACITY;
(stackPtr->count) = 0;
fprintf(stderr, "\nSuccesfully allocated memory to items...\n");
return stackPtr;
}
Run Code Online (Sandbox Code Playgroud)
现在,我的推送功能是:
void pushStack(StackP stackPtr, ItemT item) {
if ((stackPtr->count) == (stackPtr->capacity)) {
fprintf(stderr, "\nERROR: Full stack.\n");
}
else {
stackPtr->items …Run Code Online (Sandbox Code Playgroud) 我advanced collections在书中学到了一些等等,并且遇到了stacks.我得到了概念,但想制作一个快速程序,从defined point in the stack当时删除一个项目places all the values back onto the stack.我在这里有我的代码,但我得到System.InvalidOperationException类型的异常,其中堆栈的其他信息为空.我似乎无法理解; 有人可以帮忙吗?
这是我的代码:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StackRemover
{
class Program
{
static void Main(string[] args)
{
int index = 0; //the index they want to remove
Stack[] array = new Stack[1]; // will hold the array returned by remove()
Stack stack = new Stack();
//fill the stack with values from …Run Code Online (Sandbox Code Playgroud) pop()函数有什么问题,为什么它不能正常工作?
class stack{
int *p, *Cursor;
int size ;
public:
stack(int sz) {Cursor = p = new int[size=sz+1];} //consider the stack empty when its size is 1
~stack() {delete[] p;} //Cursor and P will be destroyed when the program finishes
void push(int x) {Cursor+=1; *Cursor=x; size++;}
int pop() {if(Cursor == p) return -1; int temp = *Cursor; Cursor--; size--; return (temp);}
bool isEmpty(){return(Cursor == p);}
bool isFull(){return(Cursor == p+size);}
};
Run Code Online (Sandbox Code Playgroud)
这是我的测试:
stack A(3);
std::cout<<"Empty: "<<A.isEmpty()<<std::endl;
std::cout<<"Full: "<<A.isFull()<<std::endl;
A.push(10);
A.push(20);
A.push(30); …Run Code Online (Sandbox Code Playgroud) 所以我试图从玩家的'Rack'(一个ArrayList)中删除所有牌,并将其逐个放入丢弃堆(Stack)中.到目前为止,我有以下代码,我已经意识到一旦它达到5就会停止.(注意:每个玩家机架有10张卡).
int rackSize = player.getPlayerRack().getRack().size(); // rackSize = 10
for (int i = 0; i < rackSize; i++) {
getDeck().getDiscardPile().add(player.getPlayerRack().getRack().remove(i));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何删除玩家'Rack'中的所有项目,使rackSize = 0,并将所有项目添加到弃牌堆中?
如果这令人困惑,非常抱歉.你可以通过说a中有10个整数来概括它ArrayList<Integer> hand,所以:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].如何从此列表中删除所有项目并将其添加到Stack<Integer> discardPile?
假设最初为空的堆栈S已执行总共25个推送操作,12个顶部操作和10个弹出操作,其中3个返回null以指示 空堆栈.S的当前大小是多少?
我认为S.size = 7因为10个弹出操作有10个中的3个返回null表示空堆栈但不确定它是否正确
任何人都可以给出正确的答案和解释吗?
我正在尝试使用一个结构"学生"和另一个结构"堆栈"创建一个小的链表,其中包含学生结构和指向下一个元素的指针.
但是我经常不断收到内存访问错误.我仔细检查以确保所有指针都已初始化(只有一个指针,Stacktop,初始化为NULL)
以下是结构定义:
#include <stdio.h>
#include <string>
#include <iostream>
#include <stdlib.h>
using namespace std;
struct students
{
int matnr;
string name;
};
struct stack
{
students stud;
stack *next;
};
typedef struct stack Stack;
typedef Stack *ptrStack;
void push(students s);
students pop();
int isEmpty();
void printStack(students stud);
Run Code Online (Sandbox Code Playgroud)
这是推送功能(不断崩溃程序)
#include "stack.h"
ptrStack Stacktop = NULL;
void push(students s)
{
ptrStack stack = (ptrStack)malloc(sizeof(Stack));
if (stack == NULL)
{
cout << "!!FIN!!" << endl;
return;
}
stack->stud = s;
stack->next = Stacktop; …Run Code Online (Sandbox Code Playgroud) 我很好奇小端,我知道计算机几乎都有小端方法.
所以,我通过一个程序进行了调查,来源如下.
int main(){
int flag = 31337;
char c[10] = "abcde";
int flag2 = 31337;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我通过gdb看到堆栈时,
我注意到有0x00007a69 0x00007a69 ...... ...... ...... .... ... 0x62610000 0x00656463 ......
所以,我有两个问题.
一方面,
如何能够char c[10]在旗帜下的价值?
我预计在堆栈顶部有flag2的值,在flag2下有char c [10]的值,在char c [10]下有flag的值.
像这样
7a69
"abcde"
7a69
Run Code Online (Sandbox Code Playgroud)
第二,
我预计价值会以小端的方式存储.
结果,"abcde"的值存储为"6564636261"
但是,31337的值不是通过little-endian存储的.
那只是'7a69'.我以为它应该是'697a'
为什么整数类型不符合little-endian?