您的位置:首页 > 其它

指针实现的栈(包含进制转换算法实现,括号匹配算法实现)【8】

2011-04-30 22:08 573 查看
由指针实现的栈,然后做一些小应用程序

/*
author:star
Data:2011.04.23
由指针实现的栈,然后做一些小应用程序
*/
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
using namespace std;

typedef int ElemType;
typedef int Status;

#define ERROR           0;
#define OVERFLOW    0;
#define OK                 1;

typedef struct StackNode
{
int data;
struct StackNode *next;
}SNode;

typedef struct Stack
{
struct StackNode  *top;//栈顶指针
int length;
}Stack;

Status InitStack( Stack &S )
{//初始化栈
S.top = ( SNode * ) malloc( sizeof( SNode ) );
if ( !S.top ) return ERROR;
S.top ->next = NULL;
S.length = 0;
return OK;
}

int StackLength( Stack S )
{//返回栈的长度
return S.length;
}

Status Pop( Stack &S,ElemType &e )
{//出栈操作,并将栈顶元素赋给e
if(  !StackLength( S ) )
{
cout <<"Stack is empty!"<<endl;
return ERROR;
}
e = S.top ->next  ->data;
SNode *p = S.top ;
S.top  = S.top ->next;
free( p );//把出栈的元素内存区域收回
p = NULL;
S.length --;//栈的长度减1
return OK;
}

Status Push( Stack &S, ElemType e )
{//入栈操作,将元素e压入栈中
SNode *p;
p = ( SNode * ) malloc ( sizeof( SNode ) );
if ( !p )
{
cout << "内存分配失败"<<endl;
return ERROR;
}
p ->data = e;
p ->next = S.top ->next ;
S.top ->next = p;
S.length ++;
cout <<"将元素"<<e<<"压入栈中"<<endl;
return OK;
}

Status Push( Stack &S, char e )
{//重载函数Push,用于括号匹配算法中
SNode *p;
p = ( SNode * ) malloc ( sizeof( SNode ) );
if ( !p )
{
cout << "内存分配失败"<<endl;
return ERROR;
}
p ->data = e;
p ->next = S.top ->next ;
S.top ->next = p;
S.length ++;
cout <<"将元素"<<e<<"压入栈中"<<endl;
return OK;
}
Status Pop( Stack &S, char &e )
{//重载函数Pop,此函数用于括号匹配算中
if(  !StackLength( S ) )
{
cout <<"Stack is empty!"<<endl;
return ERROR;
}
e = S.top ->next  ->data;
SNode *p = S.top ;
S.top  = S.top ->next;
free( p );//把出栈的元素内存区域收回
p = NULL;
S.length --;//栈的长度减1
cout << "元素"<< e <<"出栈"<<endl;
return OK;
}
Status OutStack( Stack S )
{//输出链表中元素
if ( !S.length ) return ERROR;
SNode *p = S.top ->next ;
cout << "输出链表:"<<endl;
for( int i = 1; i < S.length ; i++ )
{
cout << p ->data <<"、";
p = p ->next ;
}
cout << endl;
return OK;
}

Status conversion()
{//对于输入的任意一个非负十进制整数
//打印输出与其等值的八进制数
Stack S;
if( !InitStack( S ) ) return ERROR;//初始化失败
int N;
cout << "输入一个十进制整数,该操作将会将其转换成八进制整数"<<endl;
scanf( "%d", &N ); if ( N < 0 ) return ERROR;

while( N )
{
Push( S, N % 8 );
N = N / 8;
}
int e = 0;
cout <<"转换成的八进制数为:";
while( S.length )
{

Pop( S, e );
printf( "%d", e );
}
return OK;
}

Status Parentheses()
{//括号匹配算法的实现,可以检测()[  ]括号是否配对
Stack S;
if( !InitStack( S ) ) return ERROR;
char expr[ 4 ]={'(','(','(',')'};
char e;
char *p;
p =expr;

for( int i = 0; i < 4; i++ )
{
switch( *p )
{
case '(':
case '[':
Push( S, *p ); p++;
break;
case ')':
case ']':
if ( S.length )
{
Pop( S, e );
cout << "e为:"<<e <<endl;
if( *p == ')' && e != '(' || *p == '[' && e != ']' )//注意, &&的优先级高于 || ,所以先运算什么要先看清,&&运算符是左结合性的
{//栈顶的括号与目前×P指向的括号不匹配
cout <<"括号不匹配"<<endl;
return ERROR;
}
else
{
p++;
break;
}
}
default:p++;//其他字符不处理
}
}
if ( !S.length )
cout << "括号匹配!"<<endl;
else
cout << "缺少匹配的右括号!"<<endl;
return OK;
}
int main()
{
Stack Stk;
int elem=0;

InitStack( Stk );
for( int i = 0; i < 5; i++ )
Push( Stk, i );
OutStack( Stk );
cout <<"conversion()函数试验:"<<endl;
conversion();//试验进制转换函数

cout << endl;
cout <<"Parentheses()函数试验:"<<endl;
Parentheses();
system("pause");
return 0;
}


VS2008下编译调试通过
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: