C语言实现顺序栈的(入栈,初始化栈,出栈,取栈顶操作)|C语言数据结构【C语言环境下可以直接运行】
这个程序可以运行的,虽然比较简单,但是是可以直接运行的。
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define Maxsize 10//最大个数
typedef int Elemtype;
typedef struct {
Elemtype data[Maxsize];
int top;
}Sqstack;
void Initstack();
void Push();
void Pop();
void Gettop();
void Pushtostack();
void Popfromstack();
int main()
{
Sqstack h;
Sqstack * s;
int choice;
s=&h;
Initstack(s);
while(1){
printf("********1.入栈 2.出栈*********\n");
printf("********3.取栈顶元素 4.退出*********\n");
printf("请选择需要进行的操作:\n");
scanf("%d",&choice);
switch(choice)
{
case 1:Pushtostack(s);break;
case 2:Popfromstack(s);break;
case 3:Gettop(s);break;
case 4:exit(0);break;
default:printf("输入错误!!!\n");
}
}
return 0;
}
void Initstack(Sqstack *S){
S->top=-1;
}//初始化栈
void Push(Sqstack *S,Elemtype x){//入栈操作
if(S->top==Maxsize)
printf("栈已满,入栈失败!\n");
else{(S->top)++;
S->data[S->top] = x ;
printf("输入的元素(%d)入栈成功!\n",x);}
}
void Pop(Sqstack *S){//出栈操作
Elemtype *x;
if(S->top==-1)
printf("此栈为空,错误\n");
else{x=&(S->data[S->top]);
S->top = S->top - 1;
printf("%d出栈成功!\n",*x);
}
}
void Gettop(Sqstack *S){//获取栈顶元素
Elemtype *x;
if(S->top<=-1)
printf("此栈为空!没有栈顶元素\n");
else{
x=&(S->data[S->top]);
printf("栈顶元素的值为%d\n",*x);
}
}
void Pushtostack(Sqstack *s){//主函数中的压栈
int n;
Elemtype e;
printf("请输入入栈元素个数(大于1):\n");
scanf("%d",&n);
for(int i=0;i<n;i++){
printf("请输入第%d个元素的值:\n",i+1);
scanf("%d",&e);
Push(s,e);
}
}
void Popfromstack(Sqstack *s){//主函数中的出栈
int n;
printf("请输入出栈元素个数(大于1):\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
Pop(s);
}
}
遇到的一些问题:指针越界,指针的加法表示的内容,初始化问题。
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
例:
1、char a[20];
2、int *ptr = a;
…
…
3、ptr++;
在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。