1 //顺序栈
2 //1、 顺序栈的类型定义
3 #define StackSize 100 //假定预分配的栈空间最多为100个元素
4 typedef char DataType;//假定栈元素的数据类型为字符
5 typedef struct{
6 DataType data[StackSize];
7 int top;
8 }SeqStack;
9 //顺序栈的基本运算
10 //(1) 置栈空
11 void InitStack(SeqStack *S)
12 {//将顺序栈置空
13 S->top=-1;
14 }
15
16 //(2) 判栈空
17 int StackEmpty(SeqStack *S)
18 {
19 return S->top==-1;
20 }
21
22 //(3) 判栈满
23 int StackFull(SeqStack *SS)
24 {
25 return S->top==StackSize-1;
26 }
27
28 //(4) 进栈
29 void Push(S,x)
30 {
31 if (StackFull(S))
32 Error("Stack overflow"); //上溢,退出运行
33 S->data[++S->top]=x;//栈顶指针加1后将x入栈
34 }
35
36 //(5) 退栈
37 DataType Pop(S)
38 {
39 if(StackEmpty(S))
40 Error("Stack underflow"); //下溢,退出运行
41 return S->data[S->top--];//栈顶元素返回后将栈顶指针减1
42 }
43
44 //(6) 取栈顶元素
45 DataType StackTop(S)
46 {
47 if(StackEmpty(S))
48 Error("Stack is empty");
49 return S->data[S->top];
50 }
51 //链栈
52 //链栈的类型说明如下:
53
54 typedef struct stacknode{
55 DataType data
56 struct stacknode *next
57 }StackNode;
58
59 typedef struct{
60 StackNode *top; //栈顶指针
61 }LinkStack;
62
63 //(1) 置栈空
64 Void InitStack(LinkStack *S)
65 {
66 S->top=NULL;
67 }
68 //(2) 判栈空
69 int StackEmpty(LinkStack *S)
70 {
71 return S->top==NULL;
72 }
73
74 //(3) 进栈
75 void Push(LinkStack *S,DataType x)
76 {//将元素x插入链栈头部
77 StackNode *p=(StackNode *)malloc(sizeof(StackNode));
78 p->data=x;
79 p->next=S->top;//将新结点*p插入链栈头部
80 S->top=p;
81 }
82 //(4) 退栈
83 DataType Pop(LinkStack *S)
84 {
85 DataType x;
86 StackNode *p=S->top;//保存栈顶指针
87 if(StackEmpty(S))
88 Error("Stack underflow."); //下溢
89 x=p->data; //保存栈顶结点数据
90 S->top=p->next; //将栈顶结点从链上摘下
91 free(p);
92 return x;
93 }
94 //(5) 取栈顶元素
95 DataType StackTop(LinkStack *S)
96 {
97 if(StackEmpty(S))
98 Error("Stack is empty.")
99 return S->top->data;
100 }
101 //栈的应用实例
102 //1、数制转换
103 // 将一个非负的十进制整数N转换为另一个等价的基为B的B进制数的问题,很容//易通过"除B取余法"来解决。
104 // 【例】将十进制数13转化为二进制数。
105 /* 解答:按除2取余法,得到的余数依次是1、0、1、1,则十进制数转化为二进制数为1101。
106 分析:由于最先得到的余数是转化结果的最低位,最后得到的余数是转化结果的最高位,因此很容易用栈来解决。
107
108 转换算法如下:*/
109
110 typedef int DataType;//应将顺序栈的DataType定义改为整型
111 void MultiBaseOutput (int N,int B)
112 {//假设N是非负的十进制整数,输出等值的B进制数
113 int i;
114 SeqStack S;
115 InitStack(&S);
116 while(N){ //从右向左产生B进制的各位数字,并将其进栈
117 push(&S,N%B); //将bi进栈0<=i<=j
118 N=N/B;
119 }
120 while(!StackEmpty(&S)){ //栈非空时退栈输出
121 i=Pop(&S);
122 printf("%d",i);
123 }
124 }