用c++写的,初始化的时候一定要在形参列表里加上引用操作符(&),要么初始化就用双重指针进行操作。
因为:对谁操作(想要改变谁的值),就要得到谁的地址。如果不加上&的话,就无法改变 main函数里的 指针 s 的值,改变的只是形参的值。
目录
顺序栈:
链栈:
顺序栈:
//要注意初始化时,形参的那个引用符号(&)必须要加上!否则初始化就用双指针来做!
//其他操作的函数在形参列表里可以不用加上引用符号(&)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
const int MaxSize=100;
typedef struct
{
int data[MaxSize];
int top;
}SqStack;
//初始化,就是给指针分配一个空间
void InitStack(SqStack *&s)
{
s=(SqStack*)malloc(sizeof(SqStack));
s->top=-1;
}
//销毁栈
void DestoryStack(SqStack *s)
{
free(s);
}
//入栈操作
bool Push(SqStack *s,int element)
{
if(s->top==MaxSize-1) return false;
else
{
s->top++;
s->data[s->top]=element;
return true;
}
}
//出栈操作
bool Pop(SqStack *s)
{
if(s->top==-1) return false;
else s->top--;
return true;
}
//取栈顶元素
bool GetTop(SqStack *s,int *element)
{
if(s->top==-1) return false;
else
{
*element=s->data[s->top];
return true;
}
}
int main()
{
SqStack* s;
InitStack(s);
int *element;
int a[]={1,2,3,4,5,6,7,8,9};
for(int i=0;i<9;i++)
{
Push(s,a[i]);
}
while(GetTop(s,element))
{
Sleep(600);
printf("%d\n",*element);
Pop(s);
}
return 0;
}
链栈:
//带头结点的单链表
//根据栈的特性,肯定是用的头插法
#include<iostream>
#include<windows.h>
using namespace std;
typedef struct linknode
{
int data;
linknode *next;
}LinkStack;
void InitStack(LinkStack *&s)
{
s=(LinkStack*)malloc(sizeof(LinkStack));
s->next=NULL;
}
void DestoryStack(LinkStack *s)
{
LinkStack *pre,*p;
pre=s;
p=pre->next;
while(p!=NULL)
{
free(p);
pre=p;
p=pre->next;
}
free(pre);
}
void Push(LinkStack *s,int e)
{
LinkStack *p=(LinkStack*)malloc(sizeof(LinkStack));
p->data=e;
p->next=s->next;
s->next=p;
}
bool Pop(LinkStack *s)
{
if(s->next==NULL) return false;
LinkStack *p=s->next;
s->next=s->next->next;
free(p);
return true;
}
bool GetTop(LinkStack *s,int *e)
{
if(s->next==NULL) return false;
*e=s->next->data;
return true;
}
int main()
{
LinkStack *s;
InitStack(s);
int a[]={1,2,3,4,5,6,7,8,9};
int *element;
for(int i=0;i<9;i++)
{
Push(s,a[i]);
}
while(GetTop(s,element))
{
Sleep(600);
printf("%d\n",*element);
Pop(s);
}
return 0;
}