C语言实现入栈出栈操作
汇编中直接用PUSH和POP进行操作
C语言进行入栈和出栈操作显得更复杂
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Node
{
int data;
struct Node *next;
}StackNode;
typedef struct Stack
{
StackNode *top;
int count;
}StackQueue;
void initStack(StackQueue *S)
{
S->top = (StackNode *)malloc(sizeof(StackNode));
if (!S->top)
printf("OverFlow !\n");
S->top = nullptr;
}
void Push(StackQueue *S,int x)
{
StackNode *p = (StackNode *)malloc(sizeof(StackNode));
if (!p)
exit(0);
p->data = x;
p->next = S->top;
S->top = p;
}
int Pop(StackQueue *S)
{
int x;
StackNode *p = S->top;
x = p->data;
S->top = p->next;
free(p);
return x;
}
int Empty(StackQueue *S)
{
return S->top == NULL;
}
int ExactPop(StackQueue *S)
{
StackNode *t = S->top;
if (S->top)
{
S->top = t->next;
S->top = t;
if (!Empty(S))
return S->top->data;
}
return -1;
}
int main()
{
StackQueue Q;
StackQueue *N;
N = &Q;
initStack(N);
printf("入栈元素为:\n");
Q.count = 0;
for (int i = 0; i < 5; i++)
{
Push(N,i);
printf("%d ",i);
Q.count++;
}
printf("\n栈顶元素为:%d",ExactPop(N));
printf("\n出栈的结果为:\n");
while (Q.count != 0)
{
printf("%d ",Pop(N));
Q.count--;
}
if(ExactPop(N) == -1)
printf("\n没有元素,不存在栈顶!\n");
else
printf("栈顶元素为:%d",ExactPop(N));
getch();
}
另外
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible 1
#define overflow 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;
//函数说明
int createstack(sqstack *s);
int stackpush(sqstack *s);
void show(sqstack *s);
int stackpop(sqstack *s);
int main()
{
int j; sqstack s; createstack(&s);
do
{
printf(" ╔-----------------------------------------------╗\n"); //显示一个简易菜单
printf(" ┆ main menu ┆\n");
printf(" ┆ 1 --- 创建(Insert) ┆\n");
printf(" ┆ 2 --- 入栈(Update) ┆\n");
printf(" ┆ 3 --- 出栈(Delete) ┆\n");
printf(" ┆ 4 --- 退出( Show ) ┆\n");
printf(" ╚-----------------------------------------------╝\n");
printf("请输入所要进行的操作序号: ");
scanf("%d",&j); //接受用户的选择
switch(j) //接受用户的函数
{case 1:{createstack(&s);printf("创建成功!\n");
break;}
case 2:{stackpush(&s);show(&s);
break;}
case 3:{stackpop(&s);show(&s);
break;}
case 4:break;
default:printf("错误选择!请重选\n");break;
}
}while(j!=4); //直到i被赋值为4
getch();
return 0;
}
//构造一个空栈
int createstack(sqstack *s)
{
s->base=(int *)malloc(50*sizeof(int)); //开始分配50个整形空间
if(!s->base) exit(overflow);
s->top=s->base;
s->stacksize=50;
return ok;
}
//插入新元素为栈顶元素
int stackpush(sqstack *s)
{
int e;
if(s->top - s->base>=50){//栈满 ,追加存储空间
s->base = (int *)realloc(s->base,(50+10)*sizeof(int));
if(!s->base) exit(overflow);//存储分配失败
s->top = s->base + 50;//新扩充空间后的栈顶指针位置
s->stacksize += 10;
}
printf("请输入要入栈的值:");
scanf("%d",&e);
*s->top++ = e;
return ok;
}
//出栈
int stackpop(sqstack *s)
{
if(s->base == s->top) {printf("栈为空!不能出栈!"); return error;}
--s->top;
return ok;
}
//打印栈
void show(sqstack *s)
{
int *ww;
printf("The stack is :");
ww=s->base;
while(ww!=s->top){
printf(" %d ",*ww++);
}
printf("\n");
}