user-0 提问: 传说中的数据结构，不知道哪里错了，求提点

回复:
user: user-0
content: 引用 8 楼 自信男孩的回复:[quote=引用 5 楼 weixin_44775375 的回复:]   在大学里学习了一个学期了，大家大都对所学的专业有了基本的了解。许多同学也已经知道了到大二要开一门课叫做《数据结构》，那么今天给你们提前讲一下一个最简单的数据结构：栈。 栈的基本操作有3种：push，pop，top。 例如，给你一个数列：1 2 3 4 push：向栈中加入一个数，比如push 5，数列就变成1 2 3 4 5。 pop：从栈中删除最后面的数，比如 pop，数列就变成1 2 3。（数列变化，但是不输出。如果栈是空的，即不能 pop 操作，那就输出 error ，但是接下来的操作还是要继续的）。 top：找出栈最后面的数，比如 top ，你就要输出4。（如果栈中没有数的话，即不能 top 操作，那就输出 empty）。       然后，你们可以看出来了吧，其实栈就是一个先进后出（越先进去的元素越后面出来）的数据结构，很简单吧，下面要检验下你们的学习效果了。  Input  输入包含多组测试数据. 每组数据的第一行为一个整数 T(1 <= T <= 1000 )，接下来 T 行为对栈的操作。  Output  如果操作是top，那么输出最后面的数，如果栈中没有数的话，那就输出“empty”（不含引号）。 如果操作是pop且栈是空的，那么输出 “error”（不含引号）。 在每组测试数据的最后多加一次换行。  根据这个需求，也不是这么写的代码呢。应该是用数组模拟一个栈操作的吧[/quote] 对呀，我不就是这样写的吗

user: user-1
content: 引用 5 楼 weixin_44775375 的回复:  在大学里学习了一个学期了，大家大都对所学的专业有了基本的了解。许多同学也已经知道了到大二要开一门课叫做《数据结构》，那么今天给你们提前讲一下一个最简单的数据结构：栈。 栈的基本操作有3种：push，pop，top。 例如，给你一个数列：1 2 3 4 push：向栈中加入一个数，比如push 5，数列就变成1 2 3 4 5。 pop：从栈中删除最后面的数，比如 pop，数列就变成1 2 3。（数列变化，但是不输出。如果栈是空的，即不能 pop 操作，那就输出 error ，但是接下来的操作还是要继续的）。 top：找出栈最后面的数，比如 top ，你就要输出4。（如果栈中没有数的话，即不能 top 操作，那就输出 empty）。       然后，你们可以看出来了吧，其实栈就是一个先进后出（越先进去的元素越后面出来）的数据结构，很简单吧，下面要检验下你们的学习效果了。  Input  输入包含多组测试数据. 每组数据的第一行为一个整数 T(1 <= T <= 1000 )，接下来 T 行为对栈的操作。  Output  如果操作是top，那么输出最后面的数，如果栈中没有数的话，那就输出“empty”（不含引号）。 如果操作是pop且栈是空的，那么输出 “error”（不含引号）。 在每组测试数据的最后多加一次换行。  根据这个需求，也不是这么写的代码呢。应该是用数组模拟一个栈操作的吧

user: user-0
content: 引用 6 楼 user-2的回复:[quote=引用 4 楼 weixin_44775375 的回复:] [quote=引用 2 楼 user-2的回复:]额，这个你得把问题描述清楚一点（你想要的的结果是啥？现在的情况却是啥？），然后再上代码，而且代码尽量写些注释，让人知道你想干嘛。 你的这个是想实现栈的功能吧，用char类型数组str读取令（push入栈，pop出栈，top取栈顶），用int型数组a接收数据，其他感觉不出什么问题。 n的初始化位置不对，应该放在所有判断条件外，即scanf前写n=-1，否则一开始直接输入top或pop就错了，因为之前没对n进行初始化（没有执行n=i这条语句）。 就是C语言一个简单的数据结构的解释，等会我把题目发一下[/quote] #include <stdio.h> #include<string.h> int main() { int T,i,a[1000],n;   //a的大小1000够用吗？  char str[100]; while(~scanf("%d",&T)) { 	//给初始序列了吗？  	n = -1;          //在每个案例下先定义好n  for(i=0;i<T;i++)     //i的作用是控制循环，要用它作为数组索引？  { scanf("%s",str); if(strcmp(str,"push")==0) {  n++; scanf("%d",a+n);   //&a[n] //printf("str: %s\n", str); //scanf("%d", &a[i]);   // i做索引  //printf("n是： %d\n", n); //n=i;            //不要误此处一定会定义到n，碰到直接pop就错了  } else if(strcmp(str,"pop")==0) { 	//printf("str: %s\n", str); 	//printf("n是： %d\n", n); if(n==-1)printf("error\n"); else n--; } else if(strcmp(str,"top")==0) { 	//printf("str: %s\n", str); 	//printf("n是： %d\n", n);  if(n==-1)printf("empty\n"); else printf("%d\n",a[n]); } } printf("\n"); } return 0; }   我对C的一些函数不是怎么熟悉，大致这样先看看吧，打问号处注意看看[/quote] 谢谢你你太厉害啦

user: user-2
content: 引用 4 楼 weixin_44775375 的回复:[quote=引用 2 楼 user-2的回复:]额，这个你得把问题描述清楚一点（你想要的的结果是啥？现在的情况却是啥？），然后再上代码，而且代码尽量写些注释，让人知道你想干嘛。 你的这个是想实现栈的功能吧，用char类型数组str读取令（push入栈，pop出栈，top取栈顶），用int型数组a接收数据，其他感觉不出什么问题。 n的初始化位置不对，应该放在所有判断条件外，即scanf前写n=-1，否则一开始直接输入top或pop就错了，因为之前没对n进行初始化（没有执行n=i这条语句）。 就是C语言一个简单的数据结构的解释，等会我把题目发一下[/quote] #include <stdio.h> #include<string.h> int main() { int T,i,a[1000],n;   //a的大小1000够用吗？  char str[100]; while(~scanf("%d",&T)) { 	//给初始序列了吗？  	n = -1;          //在每个案例下先定义好n  for(i=0;i<T;i++)     //i的作用是控制循环，要用它作为数组索引？  { scanf("%s",str); if(strcmp(str,"push")==0) {  n++; scanf("%d",a+n);   //&a[n] //printf("str: %s\n", str); //scanf("%d", &a[i]);   // i做索引  //printf("n是： %d\n", n); //n=i;            //不要误此处一定会定义到n，碰到直接pop就错了  } else if(strcmp(str,"pop")==0) { 	//printf("str: %s\n", str); 	//printf("n是： %d\n", n); if(n==-1)printf("error\n"); else n--; } else if(strcmp(str,"top")==0) { 	//printf("str: %s\n", str); 	//printf("n是： %d\n", n);  if(n==-1)printf("empty\n"); else printf("%d\n",a[n]); } } printf("\n"); } return 0; }   我对C的一些函数不是怎么熟悉，大致这样先看看吧，打问号处注意看看

user: user-0
content: 在大学里学习了一个学期了，大家大都对所学的专业有了基本的了解。许多同学也已经知道了到大二要开一门课叫做《数据结构》，那么今天给你们提前讲一下一个最简单的数据结构：栈。 栈的基本操作有3种：push，pop，top。 例如，给你一个数列：1 2 3 4 push：向栈中加入一个数，比如push 5，数列就变成1 2 3 4 5。 pop：从栈中删除最后面的数，比如 pop，数列就变成1 2 3。（数列变化，但是不输出。如果栈是空的，即不能 pop 操作，那就输出 error ，但是接下来的操作还是要继续的）。 top：找出栈最后面的数，比如 top ，你就要输出4。（如果栈中没有数的话，即不能 top 操作，那就输出 empty）。       然后，你们可以看出来了吧，其实栈就是一个先进后出（越先进去的元素越后面出来）的数据结构，很简单吧，下面要检验下你们的学习效果了。  Input  输入包含多组测试数据. 每组数据的第一行为一个整数 T(1 <= T <= 1000 )，接下来 T 行为对栈的操作。  Output  如果操作是top，那么输出最后面的数，如果栈中没有数的话，那就输出“empty”（不含引号）。 如果操作是pop且栈是空的，那么输出 “error”（不含引号）。 在每组测试数据的最后多加一次换行。

user: user-0
content: 引用 2 楼 user-2的回复:额，这个你得把问题描述清楚一点（你想要的的结果是啥？现在的情况却是啥？），然后再上代码，而且代码尽量写些注释，让人知道你想干嘛。 你的这个是想实现栈的功能吧，用char类型数组str读取令（push入栈，pop出栈，top取栈顶），用int型数组a接收数据，其他感觉不出什么问题。 n的初始化位置不对，应该放在所有判断条件外，即scanf前写n=-1，否则一开始直接输入top或pop就错了，因为之前没对n进行初始化（没有执行n=i这条语句）。 就是C语言一个简单的数据结构的解释，等会我把题目发一下

user: user-0
content: 引用 1 楼 自信男孩的回复:没看出来有啥特殊的数据结构，楼主是什么问题？  另外，n为什么在进入循环之前没有初始化呢?循环里直接使用了，这个地方肯定是有问题的 必须要初始化呀好的谢谢你

user: user-2
content: 额，这个你得把问题描述清楚一点（你想要的的结果是啥？现在的情况却是啥？），然后再上代码，而且代码尽量写些注释，让人知道你想干嘛。 你的这个是想实现栈的功能吧，用char类型数组str读取令（push入栈，pop出栈，top取栈顶），用int型数组a接收数据，其他感觉不出什么问题。 n的初始化位置不对，应该放在所有判断条件外，即scanf前写n=-1，否则一开始直接输入top或pop就错了，因为之前没对n进行初始化（没有执行n=i这条语句）。

user: user-1
content: 没看出来有啥特殊的数据结构，楼主是什么问题？  另外，n为什么在进入循环之前没有初始化呢?循环里直接使用了，这个地方肯定是有问题的