利用栈的后进先出特点实现行编辑功能的程序代码(c语言)

利用栈的后进先出特点实现行编辑功能的程序代码(c语言),第1张

#include

"stdio.h"

#define

Stack_Size

100

typedef

int

StackElemType

typedef

struct//结构体定义

{

StackElemType

elem[Stack_Size]

int

top

}SeqStack

void

InitStack(SeqStack

*S)//初始化栈

{

S->top=-1

}

int

IsEmpty(SeqStack

*S)//判断是否为空

{

if(S->top

==-1)

return

1

else

return

0

}

int

IsFull(SeqStack

*S)//判断是否满栈

{

if(S->top==Stack_Size-1)

return

1

else

return

0

}

int

Push(SeqStack

*S,StackElemType

x)//入栈

{

if(S->top==Stack_Size-1)

{

printf("栈满了\n")

return

0

}

S->top++

S->elem[S->top]=x

return

1

}

int

Pop(SeqStack

*S,StackElemType

*x)//出栈

{

if(S->top

==-1)

{

printf("栈空\n")

return

0

}

*x=S->elem[S->top]

S->top--

return

1

}

int

GetTop(SeqStack

*S,StackElemType

*x)//取栈顶元素

{

if(S->top==-1)

{

printf("栈空\n")

return

0

}

*x=S->elem[S->top]

printf("\n")

return

1

}

void

PrintStack(SeqStack

*S)//打印出结果

{

int

i=S->top

while(i!=-1)

{

printf("***********

\n")

printf("

%d*******%d

\n",i+1,S->elem[i])

printf("**************\n")

i--

}

}

void

main()

{

SeqStack

S

StackElemType

pushdata,popdata,topdata

int

flag=1,i

InitStack(&S)

while(flag)

{

printf("----菜单----\n")

printf("1:

入栈\n")

printf("2:

出栈\n")

printf("3:

栈顶元素\n")

printf("4:

退出\n")

scanf("%d",&i)

switch(i)

{

case

1:printf("请输入要压入的元素\n")

scanf("%d",&pushdata)

Push(&S,pushdata)

printf("压入后的栈:\n")

PrintStack(&S)

break

case

2:Pop(&S,&popdata)

printf("d出的元素为:

%d",popdata)

printf("d出后的栈:\n")

PrintStack(&S)

break

case

3:GetTop(&S,&topdata)

printf("栈顶元素为

:

%d",topdata)

break

case

4:flag=0

break

}

}

}

您的程序有比较多的地方有问题,例举几个:

1)case '@': ClearStack(S)break清空栈后,想再不初始化就再使用?top指针其实编程空指针了。

2)什么情况下用变量的使用问题,typedef struct{。。。}SqStack,*S中的*S,InitStack(S)把S当做全局指针?基础要加强。

3)代码修正如下,可以正确运行。

#include<stdlib.h>

#include<stdio.h>

#include<string.h>

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef char Status

typedef char SElemType

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

typedef struct{

SElemType *base

SElemType *top

int stacksize

}SqStack

SqStack S

Status InitStack()

{

S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType))

if(!S.base)

exit(OVERFLOW)

S.top = S.base

S.stacksize=STACK_INIT_SIZE

return OK

}//InintStack

Status GetTop(SElemType *e)

{

if(S.top==S.base) return ERROR

*e=*(S.top-1)

return OK

}//GrtTop

Status Push(SElemType e)

{

if(S.top-S.base>=S.stacksize)

{

S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType))

if(!S.base)

{

exit(OVERFLOW)

}

S.top=S.base+S.stacksize

S.stacksize+=STACKINCREMENT

}

*S.top++=e

return OK

}//Push

SElemType Pop()

{

SElemType ch

if(S.top==S.base)

{

return ERROR

}

ch=*(--S.top)

return ch

}//Pop

Status ClearStack()

{

S.top=0

return OK

}//ClearStack

Status DestroyStack()

{

S.top=0

return OK

}

void LineEdit()

{

InitStack()

char ch

ch=getchar()

while(ch!='\n')

{

while(ch!='\n')

{

switch(ch)

{

case '#': printf("\n出栈%c",Pop())

break

//case '@': ClearStack()

// break

default : Push(ch)

break

}

ch=getchar()

}

}

DestroyStack()

}

int main()

{

LineEdit()

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12013222.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存