1.编写一个程序实现顺序栈(假设栈中元素类型 ElemType 为char)
的各种基本运算完成如下功能:
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define max 100
typedef char elemtype;
typedef struct
{
elemtype data[max];
int top; //栈顶
}Sqstack; //说明顺序栈类型
void initstack(Sqstack *&s) //初始化顺序栈
{
s = (Sqstack*)malloc(sizeof(Sqstack));
s->top = -1;
}
void destorystack(Sqstack*& s) //销毁顺序栈
{
free(s);
}
bool stackempty(Sqstack*s) //判断栈是否为空
{
return s->top == -1;
}
bool push(Sqstack*& s, elemtype e) //进栈
{
if (s->top == max - 1)
{
return false;
}
s->top++;
s->data[s->top] = e;
return true;
}
bool pop(Sqstack*& s, elemtype &e) //出栈
{
if (s->top == -1)
{
return false;
}
e = s->data[s->top];
s->top--;
return true;
}
bool gettop(Sqstack* s, elemtype& e) //取栈顶元素
{
if (s->top == -1)
{
return false;
}
e = s->data[s->top];
return true;
}
int main()
{
elemtype e;
Sqstack *s;
printf("顺序栈的基本算法如下\n");
printf("1.初始化栈s\n");
initstack(s);
printf("2.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("3.依次进栈元素abcde\n");
push(s, 'a');
push(s, 'b');
push(s, 'c');
push(s, 'd');
push(s, 'e');
printf("4..栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("5.出栈序列:\n");
while (!stackempty(s))
{
pop(s, e);
printf("%c", e);
}
printf("\n");
printf("6.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("7.释放栈\n");
destorystack(s);
return 1;
}
值得注意的是,在栈中判断栈是否为空的条件应该是top==-1而不是top==0.
运行结果如下:
2.内容:编写一个程序实现链栈(假设栈中元素类型ElemType为char)的
各种基本运算,完成如下功能:
(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a、b、c、d、e。
(4)判断栈s是否非空。
(5)输出出栈序列。
(6)判断栈s是否非空。
(7)释放栈。
代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef char elemtype;
typedef struct linknode
{
elemtype data; //数据域
struct linknode* next; //指针域
}linkstnode; //链栈类型定义
void initstack(linknode*&s) //初始化链栈
{
s = (linkstnode*)malloc(sizeof(linkstnode));
s->next = NULL;
}
void destorystack(linknode*& s) //销毁链栈
{
linkstnode* p = s->next;
while (p != NULL)
{
free(s);
s = p;
p = p->next;
}
free(s);
}
bool stackempty(linknode*s) //判断栈是否为空
{
return s->next == NULL;
}
void push(linknode*& s, elemtype e) //进栈
{
linkstnode* p;
p = (linkstnode*)malloc(sizeof(linkstnode));
p->data = e;
p->next = s->next;
s->next = p;
}
bool pop(linknode*& s, elemtype &e) //出栈
{
linkstnode* p;
if (s->next == NULL)
{
return false;
}
p = s->next;
e = p->data;
s->next = p->next;
free(p);
return true;
}
bool gettop(linknode* s, elemtype& e) //取栈顶元素
{
if (s->next == NULL)
{
return false;
}
e = s->next->data;
return true;
}
int main()
{
elemtype e;
linknode*s;
printf("链栈的基本算法如下\n");
printf("1.初始化栈s\n");
initstack(s);
printf("2.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("3.依次进栈元素abcde\n");
push(s, 'a');
push(s, 'b');
push(s, 'c');
push(s, 'd');
push(s, 'e');
printf("4..栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("5.出栈序列:\n");
while (!stackempty(s))
{
pop(s, e);
printf("%c", e);
}
printf("\n");
printf("6.栈为:%s \n", (stackempty(s) ? "空" : "非空"));
printf("7.释放栈\n");
destorystack(s);
return 1;
}
与顺序栈大致框架相同,注意出入栈时s指向统一。
运行结果如下:
至此栈的存储结构告一段落,下期将实现环形队列与链队的基本算法^_^