今天复习数据结构时,使用cout遇到了一个问题
#include <iostream>
using namespace std;
///顺序栈/
#define MaxNum 20
typedef struct Stack
{
int* data;
int top;
}*St;
//创建栈
St cteate()
{
St stack = new Stack;
(*stack).data = new int[MaxNum];
(*stack).top = -1;
return stack;
}
//入栈
void push(St stack, int n)
{
//前提:栈存在
if (&stack == NULL) return;
(*stack).data[++(*stack).top] = n;
}
//出栈 并返回栈顶元素
int pop(St stack)
{
return (*stack).data[(*stack).top--];
}
//返回栈顶元素
int top(St stack)
{
return (*stack).data[(*stack).top];
}
//判断栈是否为空
int isempty(St stack)
{
//栈空返回1
if ((*stack).top == -1) return 1;
//不空返回0
else return 0;
}
int main()
{
Stack* s=cteate();
for (int i = 1; i < 5; i++)
{
push(s, i);
}
cout << top(s) << endl;
cout << pop(s) << endl;
cout << top(s) << endl;
cout << pop(s) <<' '<<pop(s);
//cout << pop(s) <<endl;
/*int a = 1;
cout << a << ' ';
cout << a++ << ' ';
cout << ++a << endl;
int b = 1;
cout << b <<' '<< b++ <<' '<< ++b;*/
return 0;
}
在主函数里,我希望输出为
4
4
3
3 2
但实际输出为
4
4
4
2 3
也就是以下这条语句出现了问题
cout << pop(s) <<' '<<pop(s);
我首先想到的是,这似乎是栈这种数据结构的特点,后进先出。也许在cout调用的时候先把第一个pop(s)的结果“3”存入流中,再把第二个pop(s)的结果“2”存入流中,然后按照“栈”的特点,先输出2,再输出3
但这很快被我否定了,之前我使用cout输出时一直是从左到右输出
例子1
cout << 1 << ' ' << 2 << ' ' <<3<< endl;
输出
1 2 3
例子2
int fun(int i)
{
return i + 1;
}
int main()
{
cout << fun(0) << ' ' << fun(1) << ' ' << fun(2) << endl;
return 0;
}
输出
1 2 3
可见,无论是直接输出数字,或是调用函数输出,cout输出顺序都是从左到右
于是我查了一些资料:
C++输出流 cout 相关问题_c++中输出流cout<<a,c=0-CSDN博客
原来
cout 呈现的规律(注意项):
- 计算顺序:自右至左
- 输出顺序:自左至右
- std::cout<< a++:输出的是a++的值,而不是a的值
- 一条表达式语句中对同一个变量使用多次副作用语法(题目中的前缀自增和后缀自增)是未定义行为,输出什么都不算错。关于表达式的求值顺序请参考:求值顺序
而我的问题在于 “一条表达式语句中对同一个变量使用多次副作用语法(题目中的前缀自增和后缀自增)是未定义行为,输出什么都不算错。关于表达式的求值顺序请参考:求值顺序 ”
我的问题应该类似于这个,导致输出出现问题
(图片源自“求值顺序引用的文章”)
最后,解决办法:分别输出两次pop(s),而不把它们写在同一个cout中
int main()
{
Stack* s=cteate();
for (int i = 1; i < 5; i++)
{
push(s, i);
}
cout << top(s) << endl;
cout << pop(s) << endl;
cout << top(s) << endl;
//将cout << pop(s) << ' '<< pop(s); 修改
cout << pop(s) << ' ';
cout<< pop(s);
return 0;
}
第一次写文章,记录一下自己学习遇到的问题,如果哪里有误,欢迎各位大佬指正,帮助我学习、进步,我会及时改正!