
实现链栈各种基本运算的算法 *
编写程序实现链栈种基本运算,并在此基础上设计一个主程序完成如下功能:
1、 初始化栈
2、 判断栈是否为空
3、 依次进栈a,b,c,d,e元素。
4、 判断栈是否为空
5、 输出栈的长度
6、 输出从栈顶蚂凳册到栈底元素
7、 输出出栈序列
8、 判断栈是否为空
9、 释放栈/
*********************************************************************************************/
#include<iostream.h>
#include<stdlib.h>
#include<stdio.h>
#define OVERFLOW -2
#define ok 1
#define STACK_INIT_SIZE 100 //存粗物储空间初始分配量
#define STACKCREMENT 10//增加分量
typedef struct{
char *base
char *top
int stacksize//当前分配的空间
int lenght
}SqStack //Sqlist
/*********************************初始化栈*************************************/
int InitStack(SqStack &S)
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char))// 分配存储闷宏空间
if(!S.base) exit(0)
S.top=S.base
S.stacksize=STACK_INIT_SIZE
S.lenght=0
return 1
}
/******************************************************************************/
/********************************判断栈是否为空******************************/
bool StackEmpty(SqStack&S){
if(S.top==S.base)return 1
else
return 0
}
/*****************************释放栈********************************/
int FreeStack(SqStack&S)
{
free(S.base)
S.top=S.base
return ok
}
/******************************************************************/
/*********************求出栈的长度*********************************/
int StackLenth(SqStack&S){
S.lenght=S.top-S.base
return S.lenght
}
/******************************************************************/
/**********************入栈*****************************************/
int Push(SqStack &S,char e){
if(S.lenght>=S.stacksize){
S.base=(char*)realloc(S.base,(S.stacksize+STACKCREMENT)*sizeof(char))//增加分配存储
if(!S.base) exit(OVERFLOW)
S.top=S.base+S.stacksize
S.stacksize+=STACKCREMENT
}
*S.top++=e
S.lenght++
return ok
}
/**************************************************************/
/****************************出栈****************************/
char Pop(SqStack&S,char &e){
if(S.base==S.top)
return 0 //当栈为空时,返回错误
else
e=*--S.top
S.lenght--
return e
}
/*************************显示*******************************/
void DispStack(SqStack S)
{
int i
for(i=S.lenghti>0i--)
{
printf("%c",*(--S.top))
}
printf("\n")
}
//*******************主函数************************************/
int main(){
int i
SqStack Lst
char a,b,c,d,e,f
char g
printf("初始化栈:\n")
InitStack(Lst)
printf("依次进栈元素a,b,c,d,e,f\n")
cin>>a>>b>>c>>d>>e>>f
Push(Lst,a)
Push(Lst,b)
Push(Lst,c)
Push(Lst,d)
Push(Lst,e)
Push(Lst,f)
printf("打印\n")
DispStack(Lst)
int l=StackLenth(Lst)
cout<<"栈的长度为"<<l<<endl
printf("出栈序列:")
for(i=1i<=6i++)
{
Pop(Lst,g)
printf("%c ",g)
}
printf("\n")
printf("栈为:%s\n",(StackEmpty(Lst)?"空":"非空"))
printf("释放栈\n")
FreeStack(Lst)
return 0
}
可以正确运行,你看下可以不??希望能帮到楼主! 我用visual C++6.0编译的,现在主流都是用这个,不好意思,WINTC我没有用过,楼主可以自己改吗??
额,你们老师太不人道了,WINTC好像在后面得加一个getch()吧??这个软件我没有用过
typedef struct node{ ElemType data
struct node *next
} LinkStack
⑴置空栈
void InitLinkStack( LinkStack * &s)
{ s=NULL
}
⑵判栈空
int IsEmptyLinkStack(LinkStack *s )
{ if(s==NULL)
return 1
else
return 0
}
⑶ 入栈/*将元素x插入链栈top的栈顶*/
void PushLinkStack(LinkStack* &s , ElemType x)
{ LinkStack *p
p=malloc(sizeof(LinkStack))/*生成新结点*s */
p->data=x
p->next=s
s=p
}
⑷出栈/*删除链栈top的栈顶结点*/
int PopLinkStack (LinkStack* &s, ElemType &x)
{ LinkStack *p
if(s==NULL) return 0
x = s->data/*将栈顶数据存入*x */
p = s/*保存栈顶结点地址*/
s = s->next/*删除郑毕原栈顶结点*/
free (p)/*释放原栈顶结点*/
return 1/*返回新栈顶指针*/
}
(5) 取栈顶元素
int GetLinkStackTop (LinkStack* s, ElemType &x)
{
if(s==NULL) return 0
x = s->data/*将栈顶数据存入*x */
return 1/*返历悄回新栈顶指针*/喊烂芹
}
主函数怎么写吧
给题主一个包含建栈、入栈、出栈的代码吧
#include <stdio.h>#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define elemType int /*元素类型*/
#define status int
#define OVERFLOW -1
#define ERROR 0
#define OK 1
typedef struct sNode {
elemType data
struct sNode *next
} sNode
typedef struct {
sNode *top /*栈顶指针*/
int length /*栈中元素个数*/
} *SLink
/* 初始化 */
/* *** 作结果:构造一个空的栈S */
void initStack (SLink *S) {
(*S) -> top = NULL /*栈顶指针的初始值为空*/
(*S) -> length = 0 /*栈中元素个数为0*/
}
/* 入栈 */
/* *** 作结果:栈S插入元素e */
status push (SLink S, 洞数elemType e) {
sNode *p
p = (sNode*)malloc (sizeof (struct sNode)) /*建立新节点*/
if (!p) /*内存分配失败*/
exit (OVERFLOW)
p->data = e
p->next = S->top /*链接到原来的栈顶*/
S->top = p /*移动栈顶指针*/
++S->length /*栈的长度增加*/
return OK
}
/*出栈*/
/* *** 作结果:删除栈S栈顶元素,并由e返回其值 */
status pop (SLink S, elemType *e) {
sNode *q
if (!S->top)
return ERROR
else {
*e = S->top -> data /*返回栈顶元素*/
q = S->top
S->隐悔top = S->top -> next /*修改栈顶指针*/
--S->length /*栈的长度减少*/
free (q) /*释放被删除的元素空间*/
return OK
}
}
/* 输出栈 */
status stackPrint (SLink S) {
sNode *p = S->top /* p指向栈顶 */
while (p!=NULL) {
printf ("%d\t",p->data)
p = p->next
}
putchar ('\n')
return OK
}
int main (void) {
SLink S
elemType e
elemType a=1,b=2,c=3,d=4
initStack (&S)
/*入栈若干元素*/
push (S, a)
push (S, b)
push (S, 灶颤正c)
push (S, d)
puts ("入栈4个元素,此时栈内容为:")
stackPrint (S)
/*出栈*/
pop (S, &e)
puts ("出栈1个元素,此时栈内容为:")
stackPrint (S)
getch () /*屏幕暂留*/
return 0
}
运行结果
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)