一朵花儿开,就有一朵花儿败,满山的鲜花,只有代码最可爱
#include<stdio.h> #include <stdlib.h> #define MAXSIZE 100 //定义最大存储空间 #define STACKINCREMENT 10 //增加的存储空间,increment意为:加薪、增值 typedef struct { int *base; int *top; int sum; //记录元素个数 int stacksize; }Stack; //初始化栈 void Init(Stack *s){ s->base=(int *)malloc(MAXSIZE*sizeof(Stack)); if(s->base==NULL){ printf("内存分配失败!"); } s->top=s->base; s->stacksize=MAXSIZE; s->sum=0; } //在栈顶插入一个元素 void Push(Stack *s){ int e; printf("请输入要插入的元素:"); scanf("%d",&e); if(s->top-s->base>=s->stacksize){ s->base=(int *)realloc(s->base,s->stacksize+STACKINCREMENT*sizeof(Stack)); if(s->base==NULL) { printf("内存添加失败!"); } s->stacksize=s->stacksize+STACKINCREMENT; } *(s->top++)=e; s->sum++; } //向栈内输入元素 void Input(Stack *s){ int e; printf("请依次输入数据\n"); while(s->top-s->base<s->stacksize){ //e=NULL; scanf("%d",&e); s->sum++; *(s->top++)=e; if(getchar()=='\n') break; } } //打印栈内元素 void PrintStack(Stack *s){ int e; printf("栈内元素为:"); for(int i=1;i<=s->sum;i++) { e=*(s->top-i); printf("%d ",e); } printf("\n"); } //情况栈内元素 void ClearStack(Stack *s){ while(s->top!=s->base) { --s->top; } } //删除栈顶元素 void Pop(Stack *s){ int e; if(s->base==s->top){ printf("栈为空!"); exit(0); } else{ e=*(--s->top); } s->sum--; } //返回元素个数 int Stacklength(Stack *s){ return s->sum; } //返回栈顶元素 void GetTop(Stack *s) { int e; if(s->base==s->top) { printf("栈为空!"); exit(0); } e=*(s->top-1); printf("栈顶元素为:%d\n",e); } int main(){ Stack stack1,*p; p=&stack1; Init(p); Input(p); Push(p); GetTop(p); PrintStack(p); Pop(p); PrintStack(p); ClearStack(p); } /* 运行结果 请依次输入数据 1 2 3 4 5 6 请输入要插入的元素:9 栈顶元素为:9 栈内元素为:9 6 5 4 3 2 1 栈内元素为:6 5 4 3 2 1 Program ended with exit code: 0 */
上面代码要注意--s->top与top-1的区别,执行--s->top时,栈的长度会改变,因为指针下移,而执行top-1时,指针的指向并未改变;
#include <stdio.h> #include<stdlib.h> typedef struct Stack { int date; int stacksize; //记录元素个数 struct Stack *next; struct Stack *base; //栈底指针 struct Stack *top; //栈顶指针 }Stack; //输入数据 void InitStack(Stack *s) { s->stacksize=0; int e; Stack *p; printf("请输入数据:\n"); for (int i=0;;i++) { p=(Stack *)malloc(sizeof(Stack)); if(!p) exit(0); scanf("%d",&e); p->date=e; if(s->stacksize==0) //当插入第一个元素时,指针的变化 { s->base=p; //赋给栈底指针 s->top=p; p->next=NULL; } else { p->next=s->top; s->top=p; } s->stacksize++; if(getchar()=='\n') //此句要放最后 break; } } //在栈顶插入数据 void push(Stack *s,int *num) { Stack *p; p=(Stack *)malloc(sizeof(Stack)); if(!p) exit(0); p->date=*num; p->next=s->top; s->top=p; s->stacksize++; } //显示栈内元素 void ShowStack(Stack *s) { int e; Stack *p; p=s->top; for(int i=0;i<s->stacksize;i++) { e=p->date; p=p->next; printf("%d ",e); } printf("\n"); } //栈出栈顶元素 void Pop(Stack *s) { Stack *p; p=s->top; s->top=p->next; free(p); s->stacksize--; } int main() { int e=9; Stack stack1,*p; p=&stack1; InitStack(p); push(p,&e); ShowStack(p); Pop(p); ShowStack(p); return 0; } //运行结果 /* 请输入数据: 1 2 3 4 9 4 3 2 1 4 3 2 1 Program ended with exit code: 0 */
来源:博客园
作者:兮-风
链接:https://www.cnblogs.com/zhulmz/p/11657800.html