栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
我制作的是一个链栈, 和链表比较相像。将栈的每个元素用指针链接。
下面我们直接上代码:
#include<limits.h>
#include<algorithm>
#include<windows.h>
#include<Windows.h>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
typedef struct Node
{
int data;
Node* pNext;
}NODE,*PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
void init(PSTACK ps)
{
ps->pTop = (PNODE)malloc(sizeof(NODE));
if(NULL == ps->pTop)
exit(-1);
else
{
ps->pBottom = ps->pTop;
ps->pTop->pNext = NULL;
}
}
void push(PSTACK ps,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = ps->pTop;
ps->pTop = pNew;
}
void traverse(PSTACK ps)
{
PNODE p = ps->pTop;
while(p != ps->pBottom)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
bool empty(PSTACK ps)
{
if(ps->pTop == ps->pBottom)
return true;
else
return false;
}
bool pop(PSTACK ps,int* pval)
{
if(empty(ps))
return false;
else
{
PNODE r = ps->pTop;
*pval = r->data;
ps->pTop = r->pNext;
free(r);
r = NULL;
return true;
}
}
void clear(PSTACK ps)
{
if(empty(ps))
return;
else
{
PNODE p = ps->pTop;
PNODE q = p->pNext;
while(p != ps->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
ps->pTop = ps->pBottom;
}
}
int main(void)
{
L2:
STACK S;
printf("plase create one stack:(input -1 to stop the create)\n");
init(&S);
int n;
while(n != -1)
{
scanf("%d",&n);
if(n != -1)
push(&S,n);
}
traverse(&S);
Sleep(1000);
L1:
system("cls");
printf("the stack is:");
traverse(&S);
printf("plase chosse one operator:\n");
printf("(1)push\n" );
printf("(2)pop\n" );
printf("(3)empty\n" );
printf("(4)clear\n" );
printf("now choose:");
int a;
int k;
scanf("%d",&a);
switch(a)
{
case 1:
printf("to push:val = ");
scanf("%d",&k);
push(&S,k);
traverse(&S);
printf("the space will clear by 5s!");
Sleep(5000);
goto L1;
break;
case 2:
printf("to pop:");
pop(&S,&k);
printf("the lost number is:%d\n",k);
traverse(&S);
printf("the space will clear by 5s!");
Sleep(5000);
goto L1;
break;
case 3:
if(empty(&S))
printf("the stack is empty!\n");
else
printf("the stack isn't empty!\n");
printf("\nthe space will clear by 5s!");
Sleep(5000);
goto L1;
break;
case 4:
printf("start clear...\n");
clear(&S);
Sleep(1000);
printf("clear finish,the program stop!");
exit(-1);
default:
printf("input error!");
Sleep(1000);
goto L1;
}
}