栈的特性是:先进后出。栈的四个接口是1.栈顶。2.栈底。3.压栈。4.出栈。
递归的实现就是在模拟栈,数组是连续存放的,而链表是离散存放的。
无递归不编程。
#include<stdio.h>
void ten2two(int num)//十进制转二进制
{
if (num != 0)
{
int m = num % 2;
num = num / 2;
//printf("%d", m);//顺序输出0101
ten2two(num);
printf("%d", m);//压栈num10,5,2,1,出栈打印1,0,1,0。逆序输出
}
else
{
}
}
void main()
{
int a=10;
ten2two(10);
getchar();
}
数组模拟栈的实现,C代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 50
struct stack
{
int top;//栈顶
int data[50];//存放数据。数组在内存里面是连续存放。
};
//栈的四个接口
struct stack selfstack = { -1, { 0 } };//初始化
int isempty();//1为空,0为非空
void setempty();//栈设置为空
int push(int num);//压入数据
int pop();//弹出数据
int isempty()
{
if (selfstack.top == -1)
{
return 1;
}
else
{
return 0;
}
}
void setempty()
{
selfstack.top = -1;
}
int push(int num)
{
if (selfstack.top == N - 1)
{
return 0;
}
else
{
selfstack.top += 1;//下标移动一个
selfstack.data[selfstack.top] = num;
return 1;
}
}
int pop()
{
if (selfstack.top == -1)
{
return -1;
}
else
{
selfstack.top -= 1;
return selfstack.data[selfstack.top+1];
}
}
void main()
{
// int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int len;//数组的长度
int val[50];//存放数组的值
printf("请输入您要生成数组的长度:");
scanf_s("%d", &len);
for (int i = 0; i < len; i++)
{
printf("请输入第%d数组的值:", i + 1);
scanf_s("%d", &val[i]);
}
for (int i = 0; i < len; i++)
{
push(val[i]);
}
while (!isempty())
{
printf("%d\n",pop());
}
system("pause");
}
用链表来实现代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;
}STACK,*PSTACK;
void initStack(PSTACK);
void pushStack(PSTACK, int);
void traverse(PSTACK pS);
bool pop(PSTACK, int *);
int main()
{
STACK S;//STACk 等价于 struct Stack。执行这个元素完成之后就有了pTop,pBotoom.
int val;
initStack(&S);//造空栈
pushStack(&S, 1);//压栈
pushStack(&S, 2);
pushStack(&S, 3);
pushStack(&S, 4);
pushStack(&S, 5);
pushStack(&S, 6);
traverse(&S);//遍历输出
if (pop(&S, &val))
{
printf("出栈成功,出栈的元素是%d\n",val);
}
else
{
printf("出栈失败!\n");
}
getchar();
return 0;
}
void initStack(PSTACK pS)
{
pS->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == pS->pTop)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pS->pBottom= pS->pTop;
pS->pTop->pNext = NULL;//pS->pBotoom->pNext = NULL;
}
}
void pushStack(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");
return;
}
//把pS所指向的
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->pBottom = r->pNext;
free(r);
r = NULL;
return true;
}
}