行编辑程序

6 篇文章 0 订阅
3 篇文章 0 订阅

清华《数据结构》3.2.3

栈的链式表示:

#include <stdlib.h>
#include <stdlib.h>
#include <stdbool.h>
typedef char ElemType;

typedef struct Node
{
	ElemType data;
	struct Node *pNext;
} NODE, *PNODE;

typedef struct Stack
{
	PNODE pTop;
	PNODE pBottom;
} STACK, *PSTACK;

PSTACK creat_stack()
{
	PSTACK pStack = (PSTACK)malloc(sizeof(STACK));
	pStack->pBottom = (PNODE)malloc(sizeof(NODE));
	if(pStack->pBottom == NULL || pStack == NULL)
	{
		printf("malloc failed");
		exit(-1);
	}
	pStack->pTop = pStack->pBottom;
	return pStack;
}

bool is_empty(PSTACK pStack)
{
	bool result = false;
	if(pStack->pBottom == pStack->pTop)
	{
		result = true;
	}
	else
	{
		result = false;
	}
	return result;
}

void push(PSTACK pStack, ElemType a)
{
	PNODE pNode = (PNODE)malloc(sizeof(NODE));
	if(pNode == NULL)
	{
		exit(-1);
	}
	pNode->data = a;
	pNode->pNext = pStack->pTop;
	pStack->pTop =pNode;
}

bool pop(PSTACK pStack, ElemType* pData)
{
	if(is_empty(pStack))
	{
		return false;
	}
	else
	{
		PNODE p = pStack->pTop;
		*pData = p->data;
		pStack->pTop = p->pNext;
		free(p);
		p = NULL;
		return true;
	}
}

void traverse_stack(PSTACK pStack)
{
	PNODE current = pStack->pTop;
	printf("Now data in the stack are:\n");
	while(current != pStack->pBottom)
	{
		printf("%c ", current->data);
		current = current-> pNext;
	}
	printf("\n");
}

void clear_stack(PSTACK pStack)
{
	//isEmpty()
	PNODE p = NULL;
	while(pStack->pTop != pStack->pBottom)
	{
		p = pStack->pTop;
		pStack->pTop = p -> pNext;
		free(p);
		p = NULL;
	}
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include "栈的链式表示.h"


// 建立输入缓冲区,只接受一行用户输入,然后把这行存入用户数据区
int main()
{
    PSTACK pBufStack = creat_stack();  // 建立输入缓冲区
    char input = 0;
    while(input != '$')
    {
        do
        {
          scanf("%c", &input);
          switch(input)
          {
              case '#':
                  pop(pBufStack, NULL);
                  break;
              case '@':
                  clear_stack(pBufStack);
                  break;
              default:
                  push(pBufStack, input);
                  break;
          }
        }
        while(input != '\n' && input != '$');
        //transfer(....);  // 转移数据,每段数据先转移到一个中转栈中,中转栈再转到用户数据区,用户数据区是个队列。(中转栈只是暂时存放,每次都要清空)
    }
    getch();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值