1.顺序栈
课件上的是用指针表示,typedef,define,但是一般结题时候用数组表示更简便,且这种方法具体使用顺序栈是pop,push不一定要写成函数,直接用两句--或者++解决还好点,这里为了练习和程序的可读性还是写了。
#include <stdio.h>
#include <stdlib.h>
#define Max 1024
typedef int ElemType;
typedef struct
{
ElemType data[Max];
int top;
}Stack;
//初始化
int s[1000];
int topp=0;
void push()
{
//入栈
int pushs;
printf("请输入数据:");
scanf("%d",&pushs);
s[topp]=pushs;
topp++;
}
void pop()
{
//出栈
int pops;
topp--;
pops=s[topp];
printf("%d\n",pops);
}
int isEmpty()
{
//判空
if(topp==0)
return 1;
else
return 0;
}
void gettop()
{
//取栈顶元素
int up;
up=s[topp-1];
printf("%d\n",up);
}
void travers()
{
int i;
//if(!isEmpty())
for(i=0;i<topp;i++)
printf("%d ",s[i]);
}
int main()
{
if(isEmpty())
{
printf("空\n");
}
push();
push();
push();
travers();
gettop();
pop();
travers();
return 0;
}
2.链栈
栈也可以说是一种线性表,只不过操作只能在栈顶,根据链式的线性表建立有头插法和尾接法,所以建立链栈也可以用这两种方法。头插法,每次新来的元素放在第一位,所以要有头指针(头指针=top指针);尾接法,每次新来的元素放在第一位,所以要有尾指针(尾指针=top指针),BUT尾接法出栈时指针不好往回播,所以还是用头插法吧。
conversion to non-scalar type requested|;
错误原因,Stack,*StackLink;结构体定义时忘记加*。
#include <stdio.h>
#include <stdlib.h>
#define Max 1024
typedef int ElemType;
typedef struct Stack
{
ElemType data;
struct Stack * next;
}Stack,*StackLink;
StackLink intiStack()
{
StackLink S;
S=(StackLink)malloc(sizeof(Stack));
S->next=NULL;
return S;
}
int isEmpty(StackLink S)
{
if(!S->next)
return 1;
else
return 0;
}
void push(StackLink S)
{
StackLink top;
top=(StackLink)malloc(sizeof(Stack));
printf("请输入需要入栈的数据:");
scanf("%d",&(top->data));
top->next=S->next;
S->next=top;
//printf("%d ",S->next->data);
}
int pop(StackLink S)
{
int topdata;
StackLink top,p;
top=S->next;
if(isEmpty(S))
{
printf("栈空无法弹出数据\n");
return 0;
}
topdata=top->data;
p=top;
S->next=top->next;
free(p);
return topdata;
}
void traves(StackLink S)
{
//printf("aaaa");
StackLink top;
top=S->next;
while(top!=NULL)
{
printf("%d ",top->data);
top=top->next;
}
printf("\n");
}
int main()
{
StackLink S,top;
S=intiStack();
if(isEmpty(S))
{
printf("空\n");
}
push(S);
push(S);
push(S);
traves(S);
pop(S);
traves(S);
return 0;
}
简单的遍历一直不对,玩了会儿手机,运行可以了,什么鬼
应用1:回文的判断
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
char a[100],S[100],*p;
gets(a);
p=a;
i=0;
//字符串入栈
while(*p!='\0')
{
S[i]=*p;
i++;
p++;
}
p=a;
i--;
while(i>=0)
{
if(*p!=S[i])
break;
i--;
p++;
}
if(i==-1)
printf("是回文\n");
else
printf("不是回文\n");
return 0;
}
应用2:进制转换:
10进制---->其他进制是容易写的,余数压栈,再整除,最后一个一个出栈就行
其他进制---->10进制,首先将数字转化为字符串,然后单个字符入栈,再把单个字符出栈转化为数字应用次方加的公式
这里用到itoa(a,b,c)函数;先介绍一下这个函数,itoa()函数有3个参数:a是要转换的数字,b是要写入转换结果的目标字符串,c是转移数字时所用的基数,神奇的事情是,只要将c改为任何整数,就可以实现将10进制转换为任意进制,负数不行。