C语言printf函数压栈问题
i++是后+1,++i是先+1,多个参数的压栈顺序是从最后一个开始的因此,
上边输出的结果是第一行先++i,输出就是2,后边是I++,因此还是2;
第二行,先是i++,输出就是1,之后++i,输出就是2;
第三行,先是i++,输出就是1,之后还是i++,输出还是1,
但是本次取数完毕后,i已经经历了2次+1变成了3了,因此第四行输出的就是3
栈的操作,用c语言?急!
#includestdio.h
#includemalloc.h
#define DataType int
#define MAXSIZE 1024
typedef struct
{
DataType data[MAXSIZE];
int top;
}SeqStack;
SeqStack *Init_SeqStack()//栈初始化
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
if(!s)
{
printf(“空间不足\n”);
return NULL;
}
else
{
s-top=-1;
return s;
}
}
int Empty_SeqStack(SeqStack *s)//判栈空
{
if(s-top==-1)
return 1;
else
return 0;
}
int Push_SeqStack(SeqStack *s,DataType x)//入栈
{
if(s-top==MAXSIZE-1)
return 0;//栈满不能入栈
else
{
s-top++;
s-data[s-top]=x;
return 1;
}
}
int Pop_SeqStack(SeqStack *s,DataType *x)//出栈
{
if(Empty_SeqStack(s))
return 0;//栈空不能出栈
else
{
*x=s-data[s-top];
s-top–;
return 1;
}//栈顶元素存入*x,返回
}
DataType Top_SeqStack(SeqStack *s)//取栈顶元素
{
if(Empty_SeqStack(s))
return 0;//栈空
else
return s-data[s-top];
}
int Print_SeqStack(SeqStack *s)
{
int i;
printf(“当前栈中的元素:\n”);
for(i=s-top;i=0;i–)
printf(“%3d”,s-data[i]);
printf(“\n”);
return 0;
}
int main()
{
SeqStack *L;
int n,num,m;
int i;
L=Init_SeqStack();
printf(“初始化完成\n”);
printf(“栈空:%d\n”,Empty_SeqStack(L));
printf(“请输入入栈元素个数:\n”);
scanf(“%d”,n);
printf(“请输入要入栈的%d个元素:\n”,n);
for(i=0;in;i++)
{
scanf(“%d”,num);
Push_SeqStack(L,num);
}
Print_SeqStack(L);
printf(“栈顶元素:%d\n”,Top_SeqStack(L));
printf(“请输入要出栈的元素个数(不能超过%d个):\n”,n);
scanf(“%d”,n);
printf(“依次出栈的%d个元素:\n”,n);
for(i=0;in;i++)
{
Pop_SeqStack(L,m);
printf(“%3d”,m);
}
printf(“\n”);
Print_SeqStack(L);
printf(“栈顶元素:%d\n”,Top_SeqStack(L));
return 0;
}
c语言入栈出栈,出队入队问题
int pop(seqstack *s,char *x) {
if(s-top == 0) { // 初始化时,s-top = -1,此处以s-top == 0 判断栈为空,有矛盾
printf(“栈空\n”);
return -1;
}
else {
*x = s-c[s-top];
s-top–;
}
return 1;
}
通常,top指的位置是待压入的空结点,所以top == 0时,栈为空,top == MAXSIZE时,栈满,故应该修改初始化函数,建议蟹盖如下:
seqstack *Initstack(void) {
seqstack *s;
s = (seqstack *)malloc(sizeof(seqstack));
s-top = 0;
return s;
}
printf函数参数入栈
这个现象确实存在,但并非在printf()函数中要先执行函数的原因。这可以用下面的代码作试验,证明不是这个原因。
#include
“stdio.h”//。
int
Add1(int
*p){
return(*p+=1);
}
void
main(void){
int
a=1;
printf(“[%d]
[%d]\n”,Add1(a),a);
}
这段代码的运行结果是[2]
[1],说明并没有先执行函数Add1()。而如果把printf(“[%d]
[%d]\n”,Add1(a),a)改为printf(“[%d]
[%d]\n”,a,Add1(a))则结果是[2]
[2]。这个结果也说明printf()函数确实是从参数列表的右端开始执行的。
那么造成题目中的现象是什么原因呢?这是由C/C++对数组的处理机制造成的。printf()函数在处理数组时只把数组首地址压入栈而并不压入数组下标变量的所有内容(因为没有必要,有首地址就可以输出了)。当printf()函数从参数列表的右端开始一项一项运算压栈到最左端的一个参数后,又从左端的控制符开始按控制符指令一项一项对应弹出。对于其他变量来说,压入的是值,原来计算的结果是什么,弹出的就是什么;而题目中的字符串则不然了,先压入首地址p时,尽管p指向的内容是大小写并存的,但接着被strupr(p)变成全大写了,但压入的首地址还是由strupr(p)返回的同一个地址,弹出来输出时这个地址开始的字串已全是大写字母了……
不知说清楚了没有?供参考……